Markdown Syntax Guide

This article offers a sample of basic Markdown syntax that can be used in Hugo content files, also it shows whether basic HTML elements are decorated with CSS in a Hugo theme. ...

<span title='2019-03-11 00:00:00 +0000 UTC'>March 11, 2019</span>&nbsp;·&nbsp;3 min&nbsp;·&nbsp;Hugo Authors

2022-12-10分享 回调-协程-观察者模式-SVN分支管理-缓存思考 最近开发Android中遇到的一些技术点的总结。 回调 同步 我们比较熟悉的编程模式就是同步,调用A函数后,等待A函数结束后返回结果给B函数进行处理。 1 2 3 res = request() handle(res) other() 这就是函数的同步调用,顺序执行。handle(res)的调用必须等待request()的完成。 异步 针对上面的例子,由于request请求返回的不可预见性,我们不想去等待request()的返回,直接去调用other(),这就是异步。 异步最常见的案例就是回调函数。 回调 那么对于异步的任务来说,我们想让request()请求完成后,直接去调用handle(res)方法,这时候就可以用到回调函数。 1 2 request(handle) other() 回调就是A函数和B函数,在A的某一个环节需要B自己告诉A怎么做,这就是回调。例如去商店里买东西,暂时缺货,留下电话号码就是一个回调函数,东西来货了,店员打电话通知就是一个调用回调函数。 最经典的一个理解就是 don’t call me, I’ll call you. 实际案例 在Android开发中,大量使用到了回调函数,比较经典的案例就是网络请求的调用。app作为一个进程存在于Android系统中,其可以存在多个线程,其中有一个主线程,也叫UI线程负责整个app的UI绘制。那么对于UI线程来说,一旦存在耗时操作,如网络请求调用,那么UI线程就会被阻塞,导致UI的绘制停滞。 所以在UI线程中,不能有耗时的操作出现,那么上述的回调函数就可以很好的解决这个问题。 首先我们定义一个回调函数的接口,这个接口定义在请求完成后需要做的操作。 1 2 3 4 5 6 7 8 9 10 11 12 public interface ICallBack { /** * call it when request success */ void onSuccess(); /** * call it when request fail */ void onFail(); } 其次我们定义好请求的方法,并且在传参中加入上面定义好的回调接口。 1 2 3 4 5 6 7 8 9 10 11 12 13 public void call(String url, Map<String, String> params, final ICallBack callBack) { // call request and use the callback to resolve result boolean isSuccess = request(url, params); if (isSuccess) { callBack.onSuccess(); } else { callBack.onFail(); } } public boolean request(String url, Map<String, String> params) { return true; } 最终我们在执行请求的同时去补全我们的回调逻辑 1 2 3 4 5 6 7 8 9 10 11 12 13 public void realCall() { call("", null, new ICallBack() { @Override public void onSuccess() { // success } @Override public void onFail() { // fail } }); } 协程 回调解决了异步调用的问题,但是异步回调同样存在问题,原本统一的逻辑流拆分开了,有可能会产生回调地狱的现象,毁掉里面嵌套回调。同时上下文也在一直改变了,需要去手动维护上下文,也就是手动维护状态。 ...

2 min