关于对HandlerThread的了解
在Android中经常需要创建一个循环线程,有耗时操作时候,放到里面去操作,如果没有耗时操作,就让该线程处于等待,但是不要杀死它,
最好不要一旦有耗时任务,就立刻创建一个新线程,因为会有性能问题。
HandlerThread的父类是Thread,内部会有一个looper循环:
首先看一下HandlerThread的构造方法:
注意:一个是默认优先级,一个是可以设置优先级
开始启动:
注意:上面的run方法就是为了调用Looper.prepare和Looper.loop来构建一个循环线程
getLooper()来获取当前HandlerThread线程的mLooper对象:
注意:在获取mLooper对象的时候有一个同步的问题,只有当线程创建成功,而且Looper对象也创建成功,才会获取到mLooper对象,
这里的wait()和run里面的notifyAll()共同完成同步问题 。
结束当前线程的循环:quit()
demo:
1 public class MainActivity extends AppCompatActivity { 2 3 private Button btn ; 4 private Handler mUIHandler; 5 private Handler mSubHandler; 6 private TextView textView; 7 8 9 10 private Handler.Callback mSubCallback = new Handler.Callback() { 11 //该接口的实现就是处理异步耗时任务的,因此该方法执行在子线程中 12 @Override 13 public boolean handleMessage(Message msg) { 14 15 switch (msg.what) { 16 case 0: 17 Message msg1 = new Message(); 18 msg1.what = 0; 19 msg1.obj = java.lang.System.currentTimeMillis(); 20 mUIHandler.sendMessage(msg1); 21 break; 22 23 default: 24 break; 25 } 26 27 return false; 28 } 29 }; 30 31 @Override protected void onCreate(Bundle savedInstanceState) { 32 super.onCreate(savedInstanceState); 33 setContentView(R.layout.activity_main); 34 35 btn = (Button) this.findViewById(R.id.button); 36 textView = (TextView) findViewById(R.id.textView); 37 38 HandlerThread workHandle = new HandlerThread("workHandleThread"); 39 workHandle.start(); 40 41 //在创建Handler作为HandlerThread线程消息执行者的时候必须调用start方法之后, 42 //因为创建Handler需要的Looper参数是从HandlerThread类中获得, 43 //而Looper对象的赋值又是在HandlerThread的run方法中创建。 44 mSubHandler = new Handler(workHandle.getLooper(), mSubCallback); 45 46 btn.setOnClickListener(new View.OnClickListener() { 47 @Override public void onClick(View v) { 48 //投放异步耗时任务到HandlerThread中 49 mSubHandler.sendEmptyMessage(0); 50 51 } 52 }); 53 } 54 }
参考:http://blog.csdn.net/feiduclear_up/article/details/46840523