亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

花樣使用Handler與源碼分析

2019-10-21 21:30:17
字體:
來源:轉載
供稿:網友

前幾天在跟公司大佬討論一個問題時,看到他使用Handler的一種方式,旁邊的同事在說:以前不是這么用的啊。這個問題引發了我的好奇,雖然當時翻清楚道理了,但是還是想給大家分享一下。

Handler在之前也說到過他的使用以及源碼分析,而且相信大家都知道如何使用它,最常見的使用方法恐怕就是下面這種了:

Handler handler = new Handler(){  @Override  public void handleMessage(Message msg) {    super.handleMessage(msg);  }};

這種情況會有一個問題:我們都知道Handler是可以用在子線程給主線程更新的,當子線程給主線程回調時,主線程中的Handler通過接收發送過來的對應消息,去執行對應的任務。而對于上面這個Handler對象,如果他是主線程中的,那么我們子線程中需要拿到主線程的這個Handler對象。

  final Handler handler = new Handler(){    @Override    public void handleMessage(Message msg) {      super.handleMessage(msg);    }  };  new Thread(new Runnable() {    @Override    public void run() {      handler.sendMessage(new Message());    }  }).start();

但是上面這種寫法實在是太不好看了,而且handler還是一個局部變量,在其他方法中也無法使用。

  Handler handler;  @Override  protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    Log.e(TAG, "onCreate: " );    handler = new Handler(){      @Override      public void handleMessage(Message msg) {        super.handleMessage(msg);      }    };    new Thread(new Runnable() {      @Override      public void run() {        handler.sendMessage(new Message());      }    }).start();  }

這個看上去應該就好多了,可能也是大多數人的一種寫法。

其實說白了,如果說我們要在子線程中給主線程/相應線程回調,那么一定要拿到主線程中的Handler的索引。這么說就很直接了,可能有些情況下無法拿到主線程/相應線程的Handler,或者拿到的方法很麻煩:

public class MyService extends Service {  @Nullable  @Override  public IBinder onBind(Intent intent) {    return null;  }  @Override  public void onCreate() {    super.onCreate();    new Thread(new Runnable() {      @Override      public void run() {        //執行相關的耗時操作,然后結束后通過Handler回調給主線程      }    }).start();  }}

現在我有這樣的需求:創建一個服務,在服務中開啟一個子線程執行耗時操作,當執行完畢后回調在主線程中相應。這種情況下想要拿到主線程的Handler對象也不是不可以,方法還是有很多,把主線程的handler寫成static、創建類繼承Handler并且序列化,然后通過intent傳入.....可能還有其他的一些方法,但是就目前的這些情況來看,貌似都不是很友好。下面給大家帶來一種比較優雅且方便的方法:

public class MyService extends Service {  @Nullable  @Override  public IBinder onBind(Intent intent) {    return null;  }  @Override  public void onCreate() {    super.onCreate();    new Thread(new Runnable() {      @Override      public void run() {        /*執行相關的耗時操作,然后結束后通過Handler回調給主線程*/        new Handler(Looper.getMainLooper()).sendMessage(new Message());      }    }).start();  }}

只有一句話:又方便看著又舒服。

通過Looper.getMainLooper方法,可以獲取到主線程的Looper對象.

雖然之前說我們需要主線程中創建的Handler,其實嚴格的說是不對的。究其根本是因為主線程已經為他自己加載了mainLooper,而我們在主線程中new Handler,會默認獲取主線程的Looper引用。

  public static void main(String[] args) {    //pass    Looper.prepareMainLooper();    //pass    Looper.loop();    throw new RuntimeException("Main thread loop unexpectedly exited");  }  public Handler(Callback callback, boolean async) {    //pass    mLooper = Looper.myLooper();//在主線程中new的Handler獲取到的looper就是主線程的mainLooper    if (mLooper == null) {      throw new RuntimeException(        "Can't create handler inside thread that has not called Looper.prepare()");    }    //pass  }

現在看來就很明確了,在主線程中創建Handler只是個幌子,真正在背后操縱一切的其實是looper對象。所以只需要讓Handler的mLooper引用獲取到主線程的引用就好了。

而且Looper.getMainLooper方法是外部可見的,大膽猜測這個方法就是為了這種方便的寫法而存在的。我們可以通過這個方法獲取到主線程的looper,讓他實現主線程中接收回調。

  public Handler(Looper looper, Callback callback, boolean async) {    mLooper = looper;    mQueue = looper.mQueue;    mCallback = callback;    mAsynchronous = async;  }

但是注意我們上述的這種寫法:new Handler(....).sendMessage

這種寫法不管你怎么去實現,他無法在主線程得到回應(是給大家挖了個坑哈哈),原因很簡單:沒有重寫Handler.handlerMessage方法。

在使用Handler接受消息時有三種方式:

  • 重寫Handler.handlerMessage方法,在該方法中接收
  • 在Handler構造器中實現Callback接口,在回調接口中接收
  • 不做任何處理,但是使用post方式發送消息。

在之前我們Handler接收消息見到的幾乎都是handleMessage方法,其實這只是其中一種方法,在執行該方法之前會有一個分發的方法dispatchMessage:

  /**   * Handle system messages here.   **/  public void dispatchMessage(Message msg) {    if (msg.callback != null) {//msg中的callback,這個是通過post方法自己封裝的msg(自行查源碼),優先級是最高的      handleCallback(msg);    } else {//或者在構造器中實現Handler的Callback接口,這個優先級第二      if (mCallback != null) {        if (mCallback.handleMessage(msg)) {          return;        }      }      handleMessage(msg);//這才是我們之前最常用的方法,最低的優先級    }  }

可以看到在handlerMessage方法之前還有兩種回調的方法。在上述案例中我們并沒有重寫第三種方法,所以對于在子線程中匿名使用Handler的情況,我們可以采取上述兩種方案。代碼就不寫了,大家都是聰明人。

好了關于Handler 的更多使用就到這里了,喜歡的朋友希望多多支持。有不同意見和理解的希望評論區多多交流。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對VEVB武林網的支持.


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美日韩成人在线观看| 亚洲欧美日韩综合| 久久人人爽人人爽爽久久| 97精品伊人久久久大香线蕉| 亚洲人成电影在线播放| 欧美精品成人91久久久久久久| 国产丝袜视频一区| 国产精品免费一区二区三区都可以| 久久精品亚洲94久久精品| 性欧美激情精品| 久久免费视频在线| 亚洲精品在线观看www| 欧洲中文字幕国产精品| 久久久亚洲影院你懂的| 久久在线精品视频| 亚洲国产另类 国产精品国产免费| 国产玖玖精品视频| 欧美日在线观看| 欧美视频第一页| 国产精品国模在线| 91香蕉嫩草影院入口| 欧美精品在线观看| 国产亚洲精品高潮| 亚洲成色777777在线观看影院| 亚洲午夜未删减在线观看| 97精品视频在线| 国色天香2019中文字幕在线观看| 久久这里只有精品99| 国产999视频| 亚洲成人免费在线视频| 亚洲电影中文字幕| 欧美激情一区二区三区久久久| 成人xxxx视频| 色中色综合影院手机版在线观看| 日韩免费高清在线观看| 久久精品青青大伊人av| 26uuu日韩精品一区二区| 欧美日韩亚洲一区二| 亚洲第一精品电影| 国产精品久久久av久久久| 成人在线免费观看视视频| 欲色天天网综合久久| 91精品国产91久久久久久不卡| 高跟丝袜一区二区三区| 欧美成在线视频| 欧美国产日本高清在线| 国内精品视频在线| 成人精品一区二区三区| 亚洲精品日韩在线| 国产精品九九久久久久久久| 国产精品美女久久久免费| 日韩小视频网址| 日韩在线播放一区| 91国产美女视频| 欧美成人亚洲成人| 性欧美在线看片a免费观看| 麻豆国产va免费精品高清在线| 亚洲人成电影在线观看天堂色| 亚洲成色www8888| 日韩av成人在线观看| 国产aaa精品| 成人国产精品一区二区| 一区二区成人精品| 国产综合色香蕉精品| 91在线高清免费观看| 国产精品99久久久久久www| 久久综合五月天| 国内精品久久久久久久| 亚洲欧洲高清在线| 欧美一区二区三区免费观看| 国产精品高清免费在线观看| 中国日韩欧美久久久久久久久| 97人人模人人爽人人喊中文字| 欧美日韩激情网| 亚洲欧美在线一区二区| 欧美日韩国产第一页| 国产亚洲视频在线| 国产精品丝袜久久久久久不卡| 欧美最猛性xxxxx(亚洲精品)| 亚洲欧美日本精品| 夜夜躁日日躁狠狠久久88av| 国产精品日韩在线一区| 91在线视频一区| 国产精品一区二区三| 91精品啪在线观看麻豆免费| 国产精品h在线观看| 九九综合九九综合| 精品久久久久久中文字幕大豆网| 国产精品久久国产精品99gif| 欧美日本高清一区| 中文字幕亚洲国产| 午夜精品蜜臀一区二区三区免费| 欧美激情精品久久久久久久变态| 欧美日韩在线视频一区二区| 97人人爽人人喊人人模波多| 亚洲欧洲国产精品| 亚洲欧洲成视频免费观看| 啊v视频在线一区二区三区| 色综合男人天堂| 日韩电影中文字幕一区| 中文字幕亚洲第一| 成人女保姆的销魂服务| 一区二区在线视频播放| 欧美亚洲第一页| 国产精品福利在线观看网址| 久久69精品久久久久久久电影好| 亚洲成人三级在线| 亚洲自拍偷拍区| 91av视频在线免费观看| 欧美日韩一区免费| 久久视频中文字幕| 热99久久精品| 国产精品视频1区| 亚洲国产精品久久| 精品久久久久久久中文字幕| 欧美午夜无遮挡| 中文字幕日韩精品在线观看| 国产精品亚洲欧美导航| 久久久久久国产精品| 亚洲a级在线播放观看| 国产精品入口日韩视频大尺度| 久久久久这里只有精品| 欧美日韩美女在线观看| 国产偷亚洲偷欧美偷精品| 国产精品美女999| 26uuu另类亚洲欧美日本老年| 午夜精品久久久久久99热| 午夜免费日韩视频| 亚洲人成自拍网站| 色综合亚洲精品激情狠狠| 日韩av综合网| 91日本在线观看| 欧美亚洲另类在线| 91网在线免费观看| 久久久国产成人精品| 国产欧美va欧美va香蕉在| 亚洲少妇激情视频| 91精品美女在线| 久久久久久久久久国产| 91网站免费观看| 精品国产乱码久久久久久虫虫漫画| 日韩欧美中文字幕在线观看| 欧美wwwwww| 久久人人爽人人爽人人片av高清| 欧美中文在线观看| 色香阁99久久精品久久久| 亚洲欧美中文另类| 欧美电影免费看| 日韩视频永久免费观看| 8090成年在线看片午夜| 55夜色66夜色国产精品视频| 日本一区二区三区四区视频| 日韩中文字幕网站| 97精品国产91久久久久久| 国产亚洲人成网站在线观看| 国产91精品最新在线播放| 亚洲国产精品电影| 久久精品免费电影| 8050国产精品久久久久久| 最好看的2019的中文字幕视频| 久久久久久久久久国产| 成人免费看片视频| www国产精品视频| 最近2019年中文视频免费在线观看|