3.3异步消息处理机制-HandlerThread

2018-11-09  本文已影响0人  205蚁

HandlerThread

1.handlerThread是什么

2.HandlerThread源码解析

![图].jpg](https://img.haomeiwen.com/i1976436/b685ef3b05683c64.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

HandlerThread UML

#mLooper:Looper
+mPriority:int
+mTid:-1;
--------------------
onLooperPrepared()空方法。这个方法必须在loop后
run()
getLooper();
quit()
quitSafely()
public void run(){
      Looper.prepare();
      synchronized(this){
        mLooper = Looper.myLooper();
        notifyAll();//线程通讯,通知当前的等待的线程(在下面的getLooper方法中的 wait)
      }
          Process.setThreadPriority(mPriority);//设置线程优先级可以解决一部分线程安全,内存泄露问题---------
      onLooperPrepared();
      Looper.loop();
    mTid = -1;
}
public Looper getLooper(){
    if(!isAlive()){
        return null;
    }
    synchronized(this){
        while(isAlive()&&mLooper==null){
            try{
                wait();
            }catch(InterruptedException e){
            }
        }
    }
    return mLooper;
}   

为什么:Process.setThreadPriority(mPriority);//设置线程优先级可以解决一部分线程安全,内存泄露问题----不解中

public boolean quit(){
Looper looper = getLooper();
if(looper!=null){
    looper.quit();
    return true;
}
return false;
}

使用:

public class MainActivity extends AppCompatActivity {

    private HandlerThread myHandlerThread ;
    private Handler handler ;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //创建一个线程,线程名字:handler-thread
        myHandlerThread = new HandlerThread( "handler-thread") ;
        //开启一个线程
        myHandlerThread.start();
        //在这个线程中创建一个handler对象
        handler = new Handler( myHandlerThread.getLooper() ){
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                //这个方法是运行在 handler-thread 线程中的 ,可以执行耗时操作
                Log.d( "handler " , "消息: " + msg.what + "  线程: " + Thread.currentThread().getName()  ) ;

            }
        };

        //在主线程给handler发送消息
        handler.sendEmptyMessage( 1 ) ;

        new Thread(new Runnable() {
            @Override
            public void run() {
             //在子线程给handler发送数据
             handler.sendEmptyMessage( 2 ) ;
            }
        }).start() ;

    }

    @Override
    protected void onDestroy() {
        super.onDestroy();

        //释放资源
        myHandlerThread.quit() ;
    }
}
上一篇下一篇

猜你喜欢

热点阅读