HandlerThread 的使用

来源:互联网 发布:php array_push 编辑:程序博客网 时间:2024/06/16 11:59

我们在使用Handler的时候常常会遇到一种场景:我们知道handler默认都是实现在主线程中,这时候使用handler与主线程的UI进行操作没有问题,但是当handler不在主线程中,而是在其他的子线程中,这时又该怎么进行交互呢? 另外如果在主线程的handler中需要操作费时的操作,这时为了避免ANR又该怎么办呢?(比如PushSDK与主客户端是两个相对独立的进程,在pushsdk里面的handler不是运行在主线程中,这时就需要用HandlerThread对子线程中handler进行管理)。

HandlerThead的使用还是比较简单的,见下面代码。值得注意就是在实例化HandlerThread后必须调用start()方法,不然会报空指针错。其实也不难理解,HandlerThread没有运行,当然也不会获得Looper.在后面handler中设置mHandlerThread.getLooper()时,当然就会返回一个空的Looper了,导致空指针错。

package com.vic.handler;import android.app.Activity;import android.os.Bundle;import android.os.Handler;import android.os.HandlerThread;import android.os.Message;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.Toast;import com.vic.demo.R;public class TestHandlerThread extends Activity{private Handler mHandler = null;private Button mButton = null;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);super.setContentView(R.layout.test_layout);mButton = (Button) findViewById(R.id.test);//声明HandlerThreadHandlerThread mHandlerThread = new HandlerThread("testHandlerThread");mHandlerThread.start();//启动线程mHandler = new Handler(mHandlerThread.getLooper()){@Overridepublic void handleMessage(Message msg) {Toast.makeText(TestHandlerThread.this, "handler", Toast.LENGTH_LONG).show();//也可执行相关耗时操作}};mButton.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {mHandler.sendEmptyMessage(0);}});}}
代码运行结果


0 0