关于对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

 

posted @ 2016-04-10 15:03  TwoFish  阅读(2501)  评论(0编辑  收藏  举报