您好,登錄后才能下訂單哦!
注: 相關圖片都是用的別人的
1.Handler 主要用于消息處理
2.Message:消息,子線程向UI線程發送消息,消息中攜帶者相應數據。
3.MessageQueue:消息隊列,有一個格Message消息組成
4.Looper :信息泵,循環處理消息隊列MessageQueue中的Message,將其發送給相應的Handler
5.帶Looper的Thread,如果要非UI線程中實例化Handler,必須有Looper,而一般子線程中是不存在Looper的,一個線程可以有一個Looper對象和一個MessageQueue,必行顯示調用Looper.loop( )方法給其分配出Looper對象才能使用。
一個線程對應一個Looper。
一個Looper對應一個MessageQueue。
一個Looper可以對應多個Handler。
記住:HandlerThread =普通Thread+Looper
詳細的運行過程看下兩圖:
一.Handler的方法使用
Handler可以將兩種類型消息放到消息隊列中,一種是Message另種是Runnable對象,如果是Message對象時,通過Handler的handleMessage( )方法處理,如果是Runnable對象的時候,當Handler拿到Looper發送過來的Runnable對象的時候,會直接運行Runnable的run( )方法,注意Runnable對象時運行在相應Handler所在的線程中的(一般是UI線程),沒有start,直接調用了run( )方法。
- /**
- *
- * handler.post(Runnable);
- *
- *
- */
- handler.post(new Runnable() {
- @Override
- public void run() {
- isChanging = true;
- bar.setProgress(count);
- count++;
- }
- });
- /**
- *
- *
- * hanlder.postDelayer(Runnable,timeDelayed);
- *
- */
- handler.postDelayed(new Runnable() {
- @Override
- public void run() {
- isChanging = true;
- bar.setProgress(count);
- count++;
- }
- },100);
- /**
- * 重點看一下handler是怎么發送msg的
- *
- * 1.可以發送空的Message
- * 2.可以定時發送Message
- * 3.Message可以攜帶的數據有 int what,int arg1,int arg2,Object obj, Bundle bundler(通過msg.setData(Bundle bundler)來添加到Message對象中)
- *
- * 4.Message通過Handler.obtain()方法實例化,可以進行有參、無參實例化,其中有參實例化是可以出傳入 int what,int arg1,int arg2, Object obj
- * @author VicentTung
- *
- */
- /**
- * 1.發送空的Message
- */
- handler.sendEmptyMessage(0);
- handler.sendEmptyMessageAtTime(0, System.currentTimeMillis());
- handler.sendEmptyMessageDelayed(0, 100);
- /**
- *2. 發送非空Message(Message是new出來的)
- */
- Message msg =new Message();
- Bundle data_bundle = new Bundle();
- data_bundle.putString("name", "小明");
- data_bundle.putInt("age", 12);
- msg.arg1=1;
- msg.arg2=2;
- msg.what=3;
- msg.obj="success";
- msg.setData(data_bundle);
- handler.sendMessageDelayed(msg, 100);
- /**
- * 3.發送非空Message(Message是handler.obtain()出來的)
- */
- String obj="hahah";
- int arg1=111;
- int arg2=222;
- Message msg_obtain =handler.obtainMessage();
- /**
- * 各種各樣的帶參數的obtain()方法實例化出Message對象
- */
- msg_obtain =handler.obtainMessage(what);
- msg_obtain = handler.obtainMessage(what, obj);
- msg_obtain = handler.obtainMessage(what, arg1, arg2);
- msg_obtain =handler.obtainMessage(what, arg1, arg2, obj);
- /**
- * 4.Message的移除
- */
- if(handler.hasMessages(0)){
- handler.removeMessages(0);
- }
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。