安卓中有关于界面更新的都是只能在主线程中运行,不然会抛异常(mainThread workThread等叫法),而不知道哪个版本(3.0?)网络请求只能在子线程(backgroundThread)执行,不然会抛异常
既然这么划分了,那么就涉及到一个问题,子线程与主线程的通信问题,比如主线程叫子线程完成一件事后告诉我(main),如果使用接口回调,那么调用者还是子线程,那么接口方法还是在子线程中执行。那总不能主线程每时每刻都去问子线程你做好了没吧?那样效率更低,所以安卓提供了一个消息处理机制(Looper MessageQuene message Handler)
原理简单点讲就是程序运行时主线程不断在运行(looper回圈),如果消息队列(messagequene)中放入了新的消息(message),主线就通过looper取到message对象,message对象中持有他的处理者(handler),然后调用handler处理这个消息。
在这个过程中,子线程怎么通过将结果发送给主线程呢?子线程到主线程的转变就是通过消息队列,子线程通过主线程的handler(可通过取得主线程looper创建),发送结果包装成message放入队列,队列有了东西就会通知主线程,主线就会来读取消息并执行处理者处理消息
用现实举例的话,比如学生去上课(执行任务),结果是饿了(饭桶吗= =!反正我大学就是这样)。食堂阿姨相当于主线程,她总不可能在你上课的时候一直问你饿了吗?饿了吗?了吗?吗?所以要等到学生饿了(出结果了),然后跑去食堂排队(发送到队列),食堂阿姨可能原来是在切菜,炒菜之类干其他活,看到有人来排队了,就过来问排最前面的要点什么菜(处理饿了这个结果),然后如果没人排队了,就又可以去干其他事情了
异步任务实现:
1、不需要在主线程处理结果,直接回调接口
2、需要在主线程处理结果Thread + Handler或者AsyncTask(ThreadHandler的封装)
Thread+Handler的常见实现方式
1、Activity.runOnUiThread(Runnable)
2、View.post(Runnable)
3、View.postDelayed(Runnable, long)
4、直接使用Handler
小提示:
如果不确定当前是主线程还是子线程,又想更新界面。
直接用View.post就行了,因为View里面的post方法都是发送到主线程的消息队列中