HandlerThread——自带Looper的线程

一、定义

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;
        }

    }

}

效果图



猜你喜欢

转载自blog.csdn.net/mahuicool/article/details/80696140