对于handler的定义与解释详见收藏的文章。
1.主线程可以发送“命令/任务”给子线程执行,然后子线程反馈执行结果。
对此项目中用到的实例为FindMoreFrag.java中第822行
private Handler imgHandler = new Handler(){
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case 0://下载家长圈图片成功
llNetwork.setVisibility(View.GONE);
adsAdapter.notifyDataSetChanged();
findmoreAdapter.notifyDataSetChanged();
break;
case 1://下载家长圈图片失败
findmoreAdapter.notifyDataSetChanged();
adsAdapter.notifyDataSetChanged();
break;
case 2://下载广告位图片成功
findmoreAdapter.notifyDataSetChanged();
adsAdapter.notifyDataSetChanged();
break;
case 3://下载广告位图片失败
findmoreAdapter.notifyDataSetChanged();
adsAdapter.notifyDataSetChanged();
break;
default:
break;
}
};
};
在之前的线程中有如下代码
imgHandler.sendEmptyMessage(1);//下载家长圈文章图片成功
即在子线程中发送message,handler接收message,达到改变UI的目的。其具体过程为:handler对象将消息封装成message,并将其传递给looper,looper将其放入消息队列,looper对象在消息队列中读到该消息就将其广播,handler对象收到广播就调用handlemessage方法做出反应。其中 Looper是MessageQueue的管理者。
2.为什么在handler中不能做太耗时的操作呢?
因为handler是绑定在主线程上的,如果做耗时,会假死。
- public class MyThread2 extends Activity {
- private Handler handler = null;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- HandlerThread handlerThread = new HandlerThread("myHandlerThread");
- handlerThread.start();
- handler = new Handler(handlerThread.getLooper());
- handler.post(new MyRunnable());
- System.out.println("Oncreate---The Thread id is :"
- + Thread.currentThread().getId());
- setContentView(R.layout.main);
- }
- private class MyRunnable implements Runnable {
- public void run() {
- System.out.println("Runnable---The Thread is running");
- System.out.println("Runnable---The Thread id is :"
- + Thread.currentThread().getId());
- try {
- Thread.sleep(6000);
- } catch (InterruptedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }
- }
如上代码中new HandlerThread,可以开启新线程,通过 handler = new Handler(handlerThread.getLooper());就在新线程里绑定了handler了