<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      安卓筆記俠

      專注安卓開發(fā)

      導航

      Android事件總線(一)EventBus3.0用法全解析

      前言

      EventBus是一款針對Android優(yōu)化的發(fā)布/訂閱事件總線。簡化了應用程序內(nèi)各組件間、組件與后臺線程間的通信。優(yōu)點是開銷小,代碼更優(yōu)雅,以及將發(fā)送者和接收者解耦。如果Activity和Activity進行交互還好說,如果Fragment和Fragment進行交互著實令人頭疼,我們會使用廣播來處理,但是使用廣播稍顯麻煩并且效率也不高,如果傳遞的數(shù)據(jù)是實體類需要序列化,那么很顯然成本會有點高。今天我們就來學習下EventBus3.0的使用方法。

      1.EventBus概述

      EventBus的三要素

      EventBus有三個主要的元素需要我們先了解一下:

      • Event:事件,可以是任意類型的對象。
      • Subscriber:事件訂閱者,在EventBus3.0之前消息處理的方法只能限定于onEvent、onEventMainThread、onEventBackgroundThread和onEventAsync,他們分別代表四種線程模型。而在EventBus3.0之后,事件處理的方法可以隨便取名,但是需要添加一個注解@Subscribe,并且要指定線程模型(默認為POSTING),四種線程模型下面會講到。
      • Publisher:事件發(fā)布者,可以在任意線程任意位置發(fā)送事件,直接調(diào)用EventBus的post(Object)方法。可以自己實例化EventBus對象,但一般使用EventBus.getDefault()就好了,根據(jù)post函數(shù)參數(shù)的類型,會自動調(diào)用訂閱相應類型事件的函數(shù)。

      EventBus的四種ThreadMode(線程模型)

      EventBus3.0有以下四種ThreadMode:

      • POSTING(默認):如果使用事件處理函數(shù)指定了線程模型為POSTING,那么該事件在哪個線程發(fā)布出來的,事件處理函數(shù)就會在這個線程中運行,也就是說發(fā)布事件和接收事件在同一個線程。在線程模型為POSTING的事件處理函數(shù)中盡量避免執(zhí)行耗時操作,因為它會阻塞事件的傳遞,甚至有可能會引起ANR。
      • MAIN:
        事件的處理會在UI線程中執(zhí)行。事件處理時間不能太長,長了會ANR的。
      • BACKGROUND:如果事件是在UI線程中發(fā)布出來的,那么該事件處理函數(shù)就會在新的線程中運行,如果事件本來就是子線程中發(fā)布出來的,那么該事件處理函數(shù)直接在發(fā)布事件的線程中執(zhí)行。在此事件處理函數(shù)中禁止進行UI更新操作。
      • ASYNC:無論事件在哪個線程發(fā)布,該事件處理函數(shù)都會在新建的子線程中執(zhí)行,同樣,此事件處理函數(shù)中禁止進行UI更新操作。

      2.EventBus基本用法

      EventBus使用起來很簡單,分為五個步驟:

      1.注冊
      EventBus.getDefault().register(this);
      
      2.解注冊
      EventBus.getDefault().unregister(this);
      
      3.構(gòu)造發(fā)送消息類
      public class MessageEvent {
          public String name;
          public String password;
      
      4發(fā)布消息
      EventBus.getDefault().post(new MessageEvent("dahaige","123456"));
      
      5 接收消息
      ThreadMode.MAIN 表示這個方法在主線程中執(zhí)行
      ThreadMode.BACKGROUND 表示該方法在后臺執(zhí)行,不能并發(fā)處理
      ThreadMode.ASYNC 也表示在后臺執(zhí)行,可以異步并發(fā)處理。
      ThreadMode.POSTING 表示該方法和消息發(fā)送方在同一個線程中執(zhí)行
      
      @Subscribe(threadMode = ThreadMode.MAIN)
      public void messageEventBus(MessageEvent event){
          tv_result.setText("name:"+event.name+" passwrod:"+event.password);
      }
      View Code

      3.EventBus3.0應用

      上面講到了基本用法,有的同學可能還是有點暈,這里舉一個例子來應用EventBus3.0。

      添加依賴庫

      Android Studio 配置gradle:

      compile 'org.greenrobot:eventbus:3.0.0'
      

      定義消息事件類

      public class MessageEvent {
          private String message;
          public MessageEvent(String message) {
              this.message = message;
          }
          public String getMessage() {
              return message;
          }
          public void setMessage(String message) {
              this.message = message;
          }
      }
      View Code

      注冊和取消訂閱事件

      MainActivity中注冊和取消訂閱事件(MainActivity.java)

      import android.content.Intent;
      import android.support.v7.app.AppCompatActivity;
      import android.os.Bundle;
      import android.view.View;
      import android.widget.Button;
      import android.widget.TextView;
      import org.greenrobot.eventbus.EventBus;
      import org.greenrobot.eventbus.Subscribe;
      import org.greenrobot.eventbus.ThreadMode;
      public class MainActivity extends AppCompatActivity {
          private TextView tv_message;
          private Button bt_message;
          @Override
          protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_main);
              tv_message=(TextView)this.findViewById(R.id.tv_message);
              tv_message.setText("MainActivity");
              bt_message=(Button)this.findViewById(R.id.bt_message);
              bt_message.setText("跳轉(zhuǎn)到SecondActivity");
              bt_message.setOnClickListener(new View.OnClickListener() {
                  @Override
                  public void onClick(View v) {
                    startActivity(new Intent(MainActivity.this,SecondActivity.class));
                  }
              });
              //注冊事件
              EventBus.getDefault().register(this);
          }
          @Override
          protected void onDestroy() {
              super.onDestroy();
              //取消注冊事件
              EventBus.getDefault().unregister(this);
          }
       }
      View Code

      事件訂閱者處理事件

      這里我們的ThreadMode設置為MAIN,事件的處理會在UI線程中執(zhí)行,用TextView來展示收到的事件消息:(MainActivity.java)

      @Subscribe(threadMode = ThreadMode.MAIN)
       public void onMoonEvent(MessageEvent messageEvent){
           tv_message.setText(messageEvent.getMessage());
       }
      View Code

      事件發(fā)布者發(fā)布事件

      這里創(chuàng)建了SecondActivity來發(fā)布消息:

      public class SecondActivity extends AppCompatActivity {
          private Button bt_message;
          private TextView tv_message;
          @Override
          protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_main);
              tv_message=(TextView)this.findViewById(R.id.tv_message);
              tv_message.setText("SecondActivity");
              bt_message=(Button)this.findViewById(R.id.bt_message);
              bt_message.setText("發(fā)送事件");
              bt_message.setOnClickListener(new View.OnClickListener() {
                  @Override
                  public void onClick(View v) {
                      EventBus.getDefault().post(new MessageEvent("歡迎關(guān)注劉望舒的博客"));
                      finish();
                  }
              });
      
          }
      View Code

      好了運行程序,我們看到MainActivity的TextView顯示MainActivity字樣:

      接下來我們點擊按鈕進入SecondActivity并點擊該界面中的發(fā)送事件按鈕,這時SecondActivity被finish掉,MainActivity的TextView顯示”歡迎關(guān)注劉望舒的博客”:
      ——->

      4.EventBus3.0粘性事件

      除了上面講的普通事件外,EventBus還支持發(fā)送黏性事件,就是在發(fā)送事件之后再訂閱該事件也能收到該事件,跟黏性廣播類似。為了驗證粘性事件我們修改以前的代碼:

      訂閱粘性事件

      在MainActivity中我們將注冊事件添加到button的點擊事件中:

      bt_subscription.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    //注冊事件
                    EventBus.getDefault().register(MainActivity.this);
                }
            });
      View Code

      訂閱者處理粘性事件

      在MainActivity中新寫一個方法用來處理粘性事件

      @Subscribe(threadMode = ThreadMode.POSTING,sticky = true)
       public void ononMoonStickyEvent(MessageEvent messageEvent){
           tv_message.setText(messageEvent.getMessage());
       }
      View Code

      發(fā)送黏性事件

      在SecondActivity中我們定義一個Button來發(fā)送粘性事件:

      bt_subscription.setOnClickListener(new View.OnClickListener() {
               @Override
               public void onClick(View v) {
                   EventBus.getDefault().postSticky(new MessageEvent("粘性事件"));
                   finish();
               }
           });
      View Code

      好了運行代碼再來看看效果,首先我們在MainActivity中并沒有訂閱事件,而是直接跳到SecondActivity中點擊發(fā)送粘性事件按鈕,這時界面回到MainActivity,我們看到TextView仍舊顯示著MainActivity的字段,這是因為我們現(xiàn)在還沒有訂閱事件。

      ——>

      接下來我們點擊訂閱事件,TextView發(fā)生改變顯示“粘性事件”,大功告成。

      EventBus3.0的使用就暫時分析到這,不明白的同學可以下載源碼來研究下,下一講將講解EventBus3.0的源碼。

      5.ProGuard 混淆規(guī)則

      -keepattributes *Annotation*
      -keepclassmembers class ** {
          @org.greenrobot.eventbus.Subscribe <methods>;
      }
      -keep enum org.greenrobot.eventbus.ThreadMode { *; }
      
      # Only required if you use AsyncExecutor
      -keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent {
          <init>(java.lang.Throwable);
      }
      View Code

      github源碼下載

        

       

      posted on 2016-10-26 22:58  安卓筆記俠  閱讀(847)  評論(1)    收藏  舉報

      主站蜘蛛池模板: 视频一区视频二区视频三| 亚洲午夜无码久久久久蜜臀av| 午夜久久一区二区狠狠干| 人妻系列中文字幕精品| 成人年无码av片在线观看| 亚洲日本乱码在线观看| 性色av不卡一区二区三区| 日本边添边摸边做边爱喷水| 午夜精品一区二区三区免费视频| 亚洲综合区激情国产精品| 久久99精品久久久久久9| 国产乱码精品一区二区三区中文 | 五十路丰满中年熟女中出| 麻豆国产97在线 | 欧美| 少妇又爽又刺激视频| 国产黄大片在线观看画质优化 | 同性男男黄gay片免费| 亚洲精中文字幕二区三区| 丁香五月婷激情综合第九色| 国产乱码精品一区二区上| 东京热人妻无码一区二区AV| 国产精品毛片av999999| 美女禁区a级全片免费观看| 精品免费国产一区二区三区四区| 日韩人妻久久精品一区二区| 亚洲AV熟妇在线观看| 最新中文字幕国产精品| 乱人伦人妻中文字幕不卡| 激情综合网激情国产av| 国产一区二区三区不卡视频| 97成人碰碰久久人人超级碰oo| 中文字幕无码不卡在线| 国产日韩入口一区二区| 九九在线精品国产| 久久这里都是精品二| 国产精品视频一品二区三| 少妇人妻精品一区二区| 欧美人与动交视频在线观看| 亚洲AV午夜电影在线观看| 日韩有码精品中文字幕| 韩国精品福利视频一区二区|