1.什么场景下需要使用HandlerThread
1). 比较耗时,不易于放在主线程中执行的操作(不考虑第2点使用其他线程方式也可以)
2). 有多个耗时操作需要后台执行(如果不嫌麻烦也可以考虑使用多个TThread)
2.HandlerThread的使用步骤
1). 创建HandlerThread对象
2). 执行start方法,启动HandlerThread的Looper循环
3). 在主线程中创建Handler对象并引用HandlerTherad的looper
4). 在Handler对象中加入各种消息的处理
5). 在需要的时候给步骤3创建的Handler对象发送消息
6). 不再需要HandlerThread的时候调用quit或者quitSafely停止HandlerThread
示例代码如下(没做各种错误处理,仅供参考):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
public class MainActivity extends AppCompatActivity { private Handler handler; private HandlerThread myHandlerThread ; private final int MSG_DOWNLOAD = 1; private final int MSG_DOWNLOAD2 = 2; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); myHandlerThread = new HandlerThread("test_thread"); // 这一步很重要 myHandlerThread.start(); handler = new Handler(myHandlerThread.getLooper()){ @Override public void handleMessage(Message msg) { OkHttpClient client = new OkHttpClient(); super.handleMessage(msg); switch (msg.what){ case MSG_DOWNLOAD: Request request = new Request.Builder() .url("http://baidu.com") .build(); try { Response response = client.newCall(request).execute(); Log.d("DOWNLOAD", response.body().string()); } catch (IOException e) { e.printStackTrace(); } break; case MSG_DOWNLOAD2: Request request1 = new Request.Builder() .url("http://bcoder.com") .build(); try { Response response = client.newCall(request1).execute(); Log.d("DOWNLOAD", response.body().string()); } catch (IOException e) { e.printStackTrace(); } break; } } }; ; } public void onDownload1Click(View v){ handler.sendEmptyMessage(MSG_DOWNLOAD); } public void onDownload2Click(View v){ handler.sendEmptyMessage(MSG_DOWNLOAD2); } public void onQuitClick(View v){ myHandlerThread.quit(); } } |
测试时多次点击Download1和Download2按钮,handler对象就会按点击的顺序多次下载网页baid.com和bcoder.com
3. 要不要像Thread那样写一个HandlerThread的子类?
完全没有必要,因为真正程序执行部分都在handler的消息处理里
4. quit和quitSafely的区别?
5. HandlerThread的其它特点
1). HandlerThread中的多个操作是串行按序执行的,即任务1\任务2\任务3....,所以如果你想尽早的获得运行结果,不建议使用HandlerThread这种方式
6. 测试代码下载