一、定义
HandlerThread就是一个线程,只不过这个线程有自己的Looper对象。如果Android系统需要开启多个子线程处理任务,这时候就需要用到HandlerThread了,因为它有自己的Looper和Messagequeue因此可以串联处理多个耗时任务,而不必多次创建和销毁线程消耗内存资源。
二、使用步骤
- 首先创建一个ThreadHandler对象。
//创建HanderThread对象,字符串参数表示他的名称 HandlerThread mHandlerThread=new HandlerThread("WorkThread");
- 调用start()方法开启线程,因为Looper对象是在线程内部的run方法中初始化,因此此步骤必不可少。
mHandlerThread.start();
- 创建一个Handler对象,并且与HandlerThread的Looper对象相关联,然后即可在其handleMessage()中处理耗时任务。
mHandler=new Handler(mHandlerThread.getLooper()){ @Override public void handleMessage(Message msg) { ...... } };
三、实例应用
该实例利用HandlerThread来模拟串联处理多个耗时任务。首先创建两个handler分别关联到已创建的HandlerThread中,然后在这两个handler的HandleMessage()方法中执行耗时任务,最后调用UI线程的Handler发送消息给主线程,通知TextView显示数据。布局就是两个按钮和一个TextView十分简单,因此不再给出布局文件。
package com.example.pc.handerthreadtest; import android.annotation.SuppressLint; import android.os.Handler; import android.os.HandlerThread; import android.os.Message; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; public class MainActivity extends AppCompatActivity implements OnClickListener{ private Button handleFirstMsg,handleSecondMsg; private TextView showMsg; private Handler mHandler,mSecondHandler; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); @SuppressLint("HandlerLeak") //创建主线程的Handler final Handler UIhandler=new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); Bundle bundle=msg.getData(); showMsg.setText(bundle.getString("Thread")); } }; //创建HanderThread对象,字符串参数表示他的名称 HandlerThread mHandlerThread=new HandlerThread("WorkThread"); mHandlerThread.start(); mHandler=new Handler(mHandlerThread.getLooper()){ @Override public void handleMessage(Message msg) { Message msg2= UIhandler.obtainMessage(); msg2.setData(msg.getData()); UIhandler.sendMessage(msg2); super.handleMessage(msg); } }; //创建多个Handler关联此HandlerThread,从而达到串联处理多个耗时任务。 mSecondHandler=new Handler(mHandlerThread.getLooper()){ @Override public void handleMessage(Message msg) { Message msg2= UIhandler.obtainMessage(); msg2.setData(msg.getData()); UIhandler.sendMessage(msg2); super.handleMessage(msg); } }; } //模拟耗时任务 private void FirstTask() { Message msg=mHandler.obtainMessage(); Bundle bundle=new Bundle(); bundle.putString("Thread","FirstTask"); msg.setData(bundle); try { Thread.sleep(6000); } catch (InterruptedException e) { e.printStackTrace(); } mHandler.sendMessage(msg); } private void SecondTask() { Message msg=mSecondHandler.obtainMessage(); Bundle bundle=new Bundle(); bundle.putString("Thread","SecondThread"); msg.setData(bundle); try { Thread.sleep(6000); } catch (InterruptedException e) { e.printStackTrace(); } mSecondHandler.sendMessage(msg); } private void initView() { handleFirstMsg=findViewById(R.id.handle_firstMsg); handleSecondMsg=findViewById(R.id.handle_secondMsg); showMsg=findViewById(R.id.showMsg); handleFirstMsg.setOnClickListener(this); handleSecondMsg.setOnClickListener(this); } @Override public void onClick(View view) { switch (view.getId()){ case R.id.handle_firstMsg: FirstTask(); break; case R.id.handle_secondMsg: SecondTask(); break; } } }
效果图