EventBus的使用,數據傳遞


通常情況下安卓下數據的傳遞有下面幾種方法:

1.通過intent傳遞,包括顯式意圖和隱式意圖,廣播(Broadcast)和服務都能通過Intent傳遞

    傳遞的數據類型包括8大基本數據類型    實現Parcelable或Serializable接口的類型   以及集合數組類型

2.靜態變量傳遞  在工具類下 聲明一個Object類型的靜態變量   在A中將要傳遞的值,在B中通過這個靜態變量取出來

3.通過handle在不同的線程中傳遞Object類型的數據

4.通過構造方法傳遞Object類型的數據

5.通過SharedPreferences傳遞八大基本數據類型

6.通過ContentProvider在進程間共享數據

7.通過aidl在進程進程傳遞數據

8.通過流(本地文件)傳遞八大基本數據類型和實現Serializable接口的數據類型

9.通過基類中的屬性或者方法

    屬性: 基類公有屬性  在某個子類中賦值   其他子類中都能使用

    方法: 子類調用父類的某個方法給父類某個屬性賦值  另外一個子類通過父類的另一個公有方法獲取這個值(這個方法把值返回)

10.通過上下文對象Context傳遞

     先說, activity和adapter或者activity和fragment
           1.將這個Context強轉成MainActivity對象
            他們之間數據傳遞的橋梁是context這個上下文對象,這個context對象就是我們的Activity,
            那么這個context就是MainActivity的實例化對象,我們可以將這個Context強轉成MainActivity對象,再和MainActivity進行通信
            2.如果是adapter,我們就在MainActivity中添加一個帶參數的方法,在adapter通過剛剛強轉的MainActivity對象,調剛剛創建的這個方法,參數就是我們要傳遞的數據
            如果是fragment,我們通過上邊的方法可以與MainActivity傳遞數據
     再說, 在fragment間傳遞數據

          1.在MainActivity中創建一個方法能夠將所有的Fragment返回(一般fragment放在一個集合中)

             在 Fragment2(接受數據)中創建一個帶參數(要傳遞的數據)的方法

         2.傳遞數據:在某個fragment中1(傳遞數據)獲取到強轉的MainActivity對象,根據這個對象獲取的需要傳遞數據的Fragment2的實例化對象,再根據Fragment2的實例化對象,調那個帶參數的方法,把數據傳遞過去

 

11.通過EventBus傳遞Object類型的數據

簡單地介紹下EventBus的使用

EventBus在在使用的時候有點像廣播,使用步驟如下:

1.在接收信息的類中需要注冊EventBus在不需要的時候將EventBus注銷掉.

2.發送消息的地方傳遞兩個參數,第一個參數是Object,第二個參數是一個任意類型的標記

3.在接受數據的地方創建一個方法,並加上注解,注解的標記和上邊的標記相同   這個方法的參數類型也必須和第2步中第一個參數的類型相同

EventBus與廣播相比,優點在於:EventBus在基類中注冊,那么所有繼承基類的子類相當於都注冊了EventBus,舉個例子:我在BaseActivity的onCreat中

注冊了EventBus,那么只要繼承的EventBus的Activity都注冊了EventBus,這一點我感覺非常方便,還有一點發送數據的時候不需要上下文對象(Context)

 

下邊看代碼:

1.在MainActivity中注冊EventBus

 

[java]  view plain  copy
 
  1. public class MainActivity extends Activity {  
  2.   
  3.     @Override  
  4.     protected void onCreate(Bundle savedInstanceState) {  
  5.         super.onCreate(savedInstanceState);  
  6.         setContentView(R.layout.activity_main);  
  7.         EventBus.getDefault().register(this);//注冊事件  
  8.         findViewById(R.id.button).setOnClickListener(new OnClickListener() {  
  9.   
  10.             @Override  
  11.             public void onClick(View v) {  
  12.                 startActivity(new Intent(MainActivity.this,  
  13.                         SecondActivity.class));  
  14.             }  
  15.         });  
  16.     }  
  17.   
  18.     @Subscriber(tag = "zheng")      //標記和發送消息的標記一樣的,包括類型和值都必須一樣  
  19.     public void onRecieve(String result) {//這個參數是傳遞過來的數據   類型亦必須一樣  
  20.         Toast.makeText(this, result, Toast.LENGTH_SHORT).show();  
  21.     }  
  22.   
  23.     @Override  
  24.     protected void onDestroy() {  
  25.         super.onDestroy();  
  26.         EventBus.getDefault().unregister(this);//注銷事件  
  27.     }  
  28. }  

 

 

2.在SecondActivity中發消息

 

[java]  view plain  copy
 
  1. public class SecondActivity extends Activity {  
  2.   
  3.     @Override  
  4.     protected void onCreate(Bundle savedInstanceState) {  
  5.         super.onCreate(savedInstanceState);  
  6.         setContentView(R.layout.activity_second);  
  7.         findViewById(R.id.button).setOnClickListener(new OnClickListener() {  
  8.   
  9.             @Override  
  10.             public void onClick(View v) {// 發送消息  
  11.                 EventBus.getDefault().post("zhengjiao", "zheng");//第一個是要傳遞的數據   第二個參數是標記  
  12.             }  
  13.         });  
  14.     }  
  15. }  


注意

 

1.常見問題:消息接受不到,一般情況下 必須在發送消息之前先注冊    注冊的話就必須先開啟這個界面,才能執行到onCreate中的方法,這樣才相當於注冊了

2.點擊這里下載源碼


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM