Handler,Thread 和HandlerThread三者之间关系

来源:互联网 发布:女权运动 知乎 编辑:程序博客网 时间:2024/06/08 10:05

1.Handler  是Android中消息的分发机制,它把消息加入到一个队列中(MessageQueue),并分发和处理该消息队列中的消息,从面实现在子线程中更新主线程中UI的操作。

2.Thread 是线程,一般做一些耗时的操作的时候可以开启一个线程,线程的状态一般包括:创建,就绪,运行,阻塞,等待,死亡。

3.HandlerThread 这个我也是最近听说的,之前没有怎么用过,其实本质上还是一个Thread,它继承了Thread,只是在它的内部使用了建立了Looper,可以让我们在自己的线程中进行消息的分发和处理。

它的常规用法:

mThread = new HandlerThread("fang");

mHandler = new Hanlder(mThread.getLooper()){  ..handleMessage(String msg)...}

mThread.start();

4.我实现了一个简单的小Demo,实现实时更新当前的北京时间:

public class HandlerThreadActivity extends AppCompatActivity {    private TextView mTvServiceInfo;    private boolean isUpdateInfo;    private Handler mHandler = new Handler();    private HandlerThread mCheckThread;    private Handler mCheckHandler;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_handler_thread);        initBackThread();        mTvServiceInfo = (TextView)findViewById(R.id.textview);    }    private void initBackThread() {        mCheckThread = new HandlerThread("check-message-coming");        mCheckThread.start();        mCheckHandler = new Handler(mCheckThread.getLooper()){            @Override            public void handleMessage(Message msg) {                super.handleMessage(msg);                checkForUpdate();                if (isUpdateInfo){                    mCheckHandler.sendEmptyMessageDelayed(0x01,1000);                }            }        };    }    private void checkForUpdate() {        try {            mHandler.post(new Runnable() {                @Override                public void run() {                    Calendar ca = Calendar.getInstance();                    int year = ca.get(Calendar.YEAR);//获取年份                    int month=ca.get(Calendar.MONTH);//获取月份                    int day=ca.get(Calendar.DATE);//获取日                    int minute=ca.get(Calendar.MINUTE);//分                    int hour=ca.get(Calendar.HOUR);//小时                    int second=ca.get(Calendar.SECOND);//秒                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");                    mTvServiceInfo.setText("当前北京时间:"+sdf.format(ca.getTime()));                }            });        } catch (Exception e) {            e.printStackTrace();        }    }    @Override    protected void onResume() {        super.onResume();        isUpdateInfo = true;        mCheckHandler.sendEmptyMessage(0x01);    }    @Override    protected void onPause() {        super.onPause();        isUpdateInfo = false;        mCheckHandler.removeMessages(0x01);    }    @Override    protected void onDestroy() {        super.onDestroy();        mCheckThread.quit();    }}

5.以下是HandlerThread的源码 :

class HandlerThread extends Thread {    int mPriority;    int mTid = -1;    Looper mLooper;    public HandlerThread(String name) {        super(name);        mPriority = Process.THREAD_PRIORITY_DEFAULT;    }    protected void onLooperPrepared() {    }    @Override    public void run() {        mTid = Process.myTid();        Looper.prepare();        synchronized (this) {            mLooper = Looper.myLooper();            notifyAll();        }        Process.setThreadPriority(mPriority);        onLooperPrepared();        Looper.loop();        mTid = -1;    } 
   public Looper getLooper() {        rn mLooper;    }
}6.大概就这么多吧,还在继续学习中。。。。
原创粉丝点击