我们知道在Android系统中,我们执行完耗时操作都要另外开启子线程来执行,执行完线程以后线程会自动销毁。想象一下如果我们在项目中经常要执行耗时操作,如果经常要开启线程,接着又销毁线程,这无疑是很消耗性能的?那有什么解决方法呢?
- 使用线程池
- 使用HandlerThread
本篇文章主要讲解一下问题
- HandlerThread的使用场景以及怎样使用HandlerThread?
- HandlerThread源码分析
HandlerThread的使用场景以及怎样使用HandlerThread
使用场景
HandlerThread是Google帮我们封装好的,可以用来执行多个耗时操作,而不需要多次开启线程,里面是采用Handler和Looper实现的。
怎样使用HandlerThread?
1.创建HandlerThread的实例对象
HandlerThread handlerThread = new HandlerThread("myHandlerThread");
该参数表示线程的名字,可以随便选择。
2.启动我们创建的HandlerThread线程
handlerThread.start();
3.将我们的handlerThread与Handler绑定在一起。 还记得是怎样将Handler与线程对象绑定在一起的吗?其实很简单,就是将线程的looper与Handler绑定在一起,代码如下:
mThreadHandler = new Handler(mHandlerThread.getLooper()) { @Override public void handleMessage(Message msg) { checkForUpdate(); if(isUpdate){ mThreadHandler.sendEmptyMessage(MSG_UPDATE_INFO); } } };
注意必须按照以上三个步骤来,下面在讲解源码的时候会分析其原因
完整代码如下
public class MainActivity extends AppCompatActivity { private static final int MSG_UPDATE_INFO = 0x100; Handler mMainHandler = new Handler(); private TextView mTv; private Handler mThreadHandler; private HandlerThread mHandlerThread; private boolean isUpdate = true; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mTv = (TextView) findViewById(R.id.tv); initHandlerThread(); } private void initHandlerThread() { mHandlerThread = new HandlerThread("xujun"); mHandlerThread.start(); mThreadHandler = new Handler(mHandlerThread.getLooper()) { @Override public void handleMessage(Message msg) { checkForUpdate(); if (isUpdate) { mThreadHandler.sendEmptyMessage(MSG_UPDATE_INFO); } } }; } /** * 模拟从服务器解析数据 */ private void checkForUpdate() { try { //模拟耗时 Thread.sleep(1200); mMainHandler.post(new Runnable() { @Override public void run() { String result = "实时更新中,当前股票行情:<font color='red'>%d</font>"; result = String.format(result, (int) (Math.random() * 5000 + 1000)); mTv.setText(Html.fromHtml(result)); } }); } catch (InterruptedException e) { e.printStackTrace(); } } @Override protected void onResume() { isUpdate = true; super.onResume(); mThreadHandler.sendEmptyMessage(MSG_UPDATE_INFO); } @Override protected void onPause() { super.onPause(); isUpdate = false; mThreadHandler.removeMessages(MSG_UPDATE_INFO); } @Override protected void onDestroy() { super.onDestroy(); mHandlerThread.quit(); mMainHandler.removeCallbacksAndMessages(null); } }
运行以上测试代码,将可以看到如下效果图(例子不太恰当,主要使用场景是在handleMessage中执行耗时操作)
HandlerThread的源码分析
转载自:https://lrh1993.gitbooks.io/android_interview_guide/content/android/basis/HandlerThread.html