亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android消息機制Handler用法有哪些

發布時間:2021-11-30 10:05:30 來源:億速云 閱讀:461 作者:iii 欄目:開發技術

這篇文章主要講解了“Android消息機制Handler用法有哪些”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Android消息機制Handler用法有哪些”吧!

1.簡述

Handler消息機制主要包括: MessageQueue、 Handler、 Looper、Message。

  • Message:需要傳遞的消息,可以傳遞數據;

  • MessageQueue:消息隊列,但是它的內部實現并不是用的隊列,而是通過單鏈表的數據結構來維護消息列表,因為單鏈表在插入和刪除上比較有優勢。主要功能是向消息池投遞消息( MessageQueue.enqueueMessage)和取走消息池的消息( MessageQueue.next)。 

  • Handler:消息輔助類,主要功能是向消息池發送各種消息事件( Handler.sendMessage)和處理相應消息事件( Handler.handleMessage); 

  • Looper:消息控制器,不斷循環執行( Looper.loop),從MessageQueue中讀取消息,按分發機制將消息分發給目標處理者。

2.異步線程切換原理

class LooperThread extends Thread {
      public Handler mHandler;
 
      public void run() {
          Looper.prepare();
 
          mHandler = new Handler() {
              public void handleMessage(Message msg) {
                  // process incoming messages here
              }
          };
 
          Looper.loop();
      }
  }

每一個異步線程,都維護著唯一的一個Looper,每一個Looper會初始化(維護)一個MessageQueue,之后進入一個無限循環一直在讀取MessageQueue中存儲的消息,如果沒有消息那就一直阻塞等待。

我們在實例化handler的過程中,會先得到當前所在線程的looper對象,之后得到與該looper對象相對應的消息隊列,看源碼Handler中持有Looper、MessageQueue。

private static void handleCallback(Message message) {
        message.callback.run();
    }
 
    final Looper mLooper;
    final MessageQueue mQueue;
    final Callback mCallback;

當我們發送消息的時候,即handler.sendMessage或者handler.post,會將msg中的target賦值為handler自身,這就是實現message從一個線程到另外一個線程的傳遞的本質,之后加入到消息隊列中。

private boolean enqueueMessage(MessageQueue queue, Message msg, long uptimeMillis) {
    msg.target = this;
    if (mAsynchronous) {
        msg.setAsynchronous(true);
    }
    return queue.enqueueMessage(msg, uptimeMillis);
}

我們一般會重寫handlerMessage方法處理消息,這將會在msg.target.disPatchMessage方法中被回調,從而實現了message從一個線程到另外一個線程的傳遞。

3.總結

  • 1.Handler 的背后有 Looper、MessageQueue 支撐,Looper 負責消息分發,MessageQueue 負責消息管理;

  • 2.在創建 Handler 之前一定需要先創建 Looper,Looper 有退出的功能,但是主線程的 Looper 不允許退出;

  • 3.異步線程Looper,Looper.prepare()創建Looper,Looper.loop()開始輪詢,需要自己調用 Looper.myLooper().quit()退出;

  • 4.Runnable 被封裝進了 Message,可以說是一個特殊的 Message;

  • 5.Handler.handleMessage() 所在的線程是 Looper.loop() 方法被調用的線程;

  • 6.Handler內存泄漏的原因

原因:MessageQueue持有Message,Message持有activity,delay多久,message就會持有activity多久。

解決方案:靜態內部類、弱引用,最后不要忘記調用Handler.removeCallbacksAndMessages(null)清空所有消息。

public class SampleActivity extends Activity {
 
  /**
   * Instances of static inner classes do not hold an implicit
   * reference to their outer class.
   */
  private static class MyHandler extends Handler {
    private final WeakReference<SampleActivity> mActivity;
 
    public MyHandler(SampleActivity activity) {
      mActivity = new WeakReference<SampleActivity>(activity);
    }
 
    @Override
    public void handleMessage(Message msg) {
      SampleActivity activity = mActivity.get();
      if (activity != null) {
        // ...
      }
    }
  }
 
 // MyHandler
 private final MyHandler mHandler = new MyHandler(this);
 
  /**
   * Instances of anonymous classes do not hold an implicit
   * reference to their outer class when they are "static".
   */
  private static final Runnable sRunnable = new Runnable() {
      @Override
      public void run() { /* ... */ }
  };
 
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
 
    // Post a message and delay its execution for 10 minutes.
    mHandler.postDelayed(sRunnable, 1000 * 60 * 10);
    
    // Go back to the previous Activity.
    finish();
  }
 
  @Override
  protected void onDestroy() {
        super.onDestroy();
        //mHandler.removeCallbacksAndMessages(null);
    }
}

感謝各位的閱讀,以上就是“Android消息機制Handler用法有哪些”的內容了,經過本文的學習后,相信大家對Android消息機制Handler用法有哪些這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

河东区| 炉霍县| 江口县| 崇明县| 白水县| 循化| 天津市| 和田市| 剑川县| 巴南区| 海口市| 含山县| 广西| 张家界市| 手游| 油尖旺区| 左贡县| 霍山县| 改则县| 东港市| 林州市| 乌鲁木齐市| 丘北县| 广灵县| 密山市| 肥西县| 乌拉特后旗| 百色市| 涪陵区| 灵宝市| 宜良县| 盈江县| 黎川县| 宁国市| 武平县| 浙江省| 全南县| 高雄县| 黎平县| 安化县| 三河市|