1. 程式人生 > >Android中通過EventBus傳遞訊息資料

Android中通過EventBus傳遞訊息資料

 Android開發中離不開頁面間跳轉及資料 互動,第三方開源框架存在一個Android事件匯流排框架。其開源地是:https://github.com/greenrobot/EventBus.
  我們在Android可以通過Intent,BroadCastReceiver,ContentProvider甚至回撥方法等來傳遞資料,那EventBus有什麼優勢呢?開源地址中及網路有很多介紹,我就不獻醜了。
  專案中用到了EventBus框架。用EventBus來實現訊息及資料傳遞確實方便,所以寫個Demo,方便以後使用。Demo中主要實現兩個小功能:
  1,在ListView的Adapter中通過EventBus給Activity中傳送資料,在Activity中把對應資料刪除!
  2,在第二個頁面中跳轉到第一個頁面,通過EventBus發資料給第一個頁面,在第一個頁面中Toast顯示出來。
  專案第一步,當然是去開源地址中下載EventBus的相關jar包,放入到我們的專案中,接下來就是寫程式碼了。
  public class MainActivity extends Activity {
    private ListView test_lv;
    private List<String> testDatas;
    private TestAdapter mAdapter;

    /**
     * 註冊了EventBus,就可以呼叫onEventMainThread方法來處理事件
     * EventBus中根據情況定義了4種onEvent開頭的基本操作方法,分別是:
     * 1,onEvent作為訂閱函式,那麼該事件在哪個執行緒釋出出來的,onEvent就會在這個執行緒中執行,釋出事件和接收事件執行緒在同一個執行緒。
     * 在onEvent方法中不能執行耗時操作,如果執行耗時操作容易導致事件分發延遲。
     * 2,onEventMainThread:如果使用onEventMainThread作為訂閱函式
     * ,那麼不論事件是在哪個執行緒中釋出出來的,onEventMainThread都會在UI執行緒中執行
     * 接收事件就會在UI執行緒中執行,這個在Android中是非常有用的
     * ,因為在Android中只能在UI執行緒中跟新UI,所以在onEvnetMainThread方法中是不能執行耗時操作的。
     * 3,onEventBackground:如果使用onEventBackgrond作為訂閱函式,那麼如果事件是在UI執行緒中釋出出來的,
     * 那麼onEventBackground就會在子執行緒中執行,
     * 如果事件本來就是子執行緒中釋出出來的,那麼onEventBackground函式直接在該子執行緒中執行。
     * 4,onEventAsync:使用這個函式作為訂閱函式,那麼無論事件在哪個執行緒釋出,都會建立新的子執行緒在執行onEventAsync.
     * 
     * @description
: * @author ldm * @date 2016-4-15 下午4:33:33 */
public void onEventMainThread(TestBean event) { // 比如我們在這裡要刪除這條記錄(當然有很多方法,不用這麼複雜,只是說明可以用EventBus來傳遞訊息) if (null != testDatas && event.getPosition() <= testDatas.size()) { Toast.makeText(this, event.getContent(), Toast.LENGTH_SHORT).show(); testDatas.remove(event.getPosition()); } mAdapter.notifyDataSetChanged();// 這樣就刪除成功了
/********* 還是在這裡測試SecondActivity發來的資料 吧 *********************/ if (event.getPosition() == 100) { Toast.makeText(this, "收到" + event.getContent(), Toast.LENGTH_SHORT) .show(); } } @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); EventBus.getDefault().register(this);// 在onCreate()方法中註冊EventBus test_lv = (ListView) findViewById(R.id.test_lv); initDatas(); mAdapter = new TestAdapter(MainActivity.this, testDatas); test_lv.setAdapter(mAdapter); // 跳轉到第二個頁面的點選事件 findViewById(R.id.next_btn).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { startActivity(new Intent(MainActivity.this, SecondActivity.class)); } }); } /** * 構造測試資料 * * @description: * @author ldm * @date 2016-4-15 下午4:22:06 */ private void initDatas() { testDatas = new ArrayList<String>(); for (int i = 0; i < 10; i++) { testDatas.add("這是第_" + i + "_條資料"); } } @Override protected void onDestroy() { super.onDestroy(); EventBus.getDefault().unregister(this);// 在onDestory()方法中解綁EventBus } }
/**
 * 第二個頁面
 * @description:
 * @author ldm
 * @date 2016-4-15 下午5:17:49
 */
public class SecondActivity extends Activity {
    private TextView test_tv;
    private Button jump_btn;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        test_tv = (TextView) findViewById(R.id.test_tv);
        jump_btn = (Button) findViewById(R.id.jump_btn);
        jump_btn.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // 把TextView中的文字傳遞到MainActivity
                EventBus.getDefault().post(
                        new TestBean(100, test_tv.getText().toString()));
                finish();
            }
        });
    }
}
/**
 * 測試EventBus的實體資料 Bean
 * 
 * @description:
 * @author ldm
 * @date 2016-4-15 下午4:19:03
 */
public class TestBean implements Serializable {
    private static final long serialVersionUID = 1L;
    private int position;
    private String content;

    public int getPosition() {
        return position;
    }

    public void setPosition(int position) {
        this.position = position;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    public TestBean(int position, String content) {
        super();
        this.position = position;
        this.content = content;
    }

}
//第一個頁面佈局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >
<Button
        android:id="@+id/next_btn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="下個頁面"
        android:textSize="16sp"
        android:layout_margin="10dp" />
    <ListView
        android:id="@+id/test_lv"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:divider="#d1d1d1"
        android:dividerHeight="1px" >
    </ListView>

</LinearLayout>
//第二個頁面佈局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/test_tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="10dp"
        android:textSize="16sp" 
        android:text="我給MainActivity傳遞點資料 "/>

    <Button
        android:id="@+id/jump_btn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="我選擇EventBus傳遞資料"
        android:textSize="16sp"
        android:layout_margin="10dp" />

</LinearLayout>

相關推薦

Android通過EventBus傳遞訊息資料

Android開發中離不開頁面間跳轉及資料 互動,第三方開源框架存在一個Android事件匯流排框架。其開源地是:https://github.com/greenrobot/EventBus. 我們在Android可以通過Intent,BroadCastR

Android不同Activity之間的資料傳遞

需要用到的類及方法: 類似:兩個國家做貿易,交易貨物; --傳遞載體:intent(貨船) --需要傳遞的內容:用bundle(集裝箱)包裝的string(某控制元件的值)<bundle是以鍵值

spring mvc 通過controller 傳遞物件給jsp,並且資料繫結,在修改值後回傳物件給controller

在controller 中需要指定 sessionAttribute的key @sessionattributes註解應用到Controller上面,可以將Model中的屬性同步到session當中。 當需要清除session當中的值得時候,我們只需要在

在Activity通過Bundle傳遞自定義資料型別

例項化Book類,得到Book物件book以及設定成員變數: if(TextUtils.isEmpty(bookName)||TextUtils.isEmpty(author)||TextUtils.isEmpty(id)){ Toast.makeText(AndroidBundleActivity.this

Android通過Tag為View儲存資料繫結資料

專案中有時候需要為View繫結資料,比如每一個雲標籤都對應伺服器一個標籤id,View中setTag可以方便的為控制元件繫結資料。 為控制元件繫結資料: selectCategory.setTag(R.id.tag_id, id); selectCategory.setT

AndroidActivity與Fragment之間資料相互傳遞

一、Activity啟動Activity Intent intent = new Intent(this,MainListActivity.class); startActivity(intent); Activity與Activity傳遞資料 I

Android之利用EventBus進行訊息傳遞

前言:EventBus是上週專案中用到的,網上的文章大都一樣,或者過時,有用的沒幾篇,經過琢磨,請教他人,也終於弄清楚點眉目,記錄下來分享給大家。 一、概述 EventBus是一款針對Android優化的釋出/訂閱事件匯流排。主要功能是替代Intent

Android通過反射來設置Toast的顯示時間

ring margin ner manage etc short 延遲 lln sse 這個Toast的顯示在Android中的用途還是非常大的,同一時候我們也知道toast顯示的時間是不可控的。我們僅僅能改動他的顯示樣式和顯示的位置,盡管他提供了一個顯示時間的設置方法

Struts2通過Ajax傳遞json數據

conf status port fault catch struts-2 execute 3.6 轉換 1、導入Struts2所需要的jar包 下載Struts2的jar包時,可以下載struts-2.5.13-min-lib.zip,然後放到項目的/WebConten

android 通過不同的條件,改變listview字型顏色及背景色

結果圖: 通過介面卡進行操作: public class SystemAdapter extends BaseAdapter { private ArrayList<SjClass> sData; private Context sContext;

android通過usb和pc進行通訊

找到的最好的部落格 https://blog.csdn.net/jakemiao/article/details/17270785?locationNum=7&fps=1 下面是demo: https://github.com/yunzheyue/usbCommunication

Vue通過路由傳遞引數

Vue中可以通過路由傳遞引數,具體實現也比較方便 以 '/aaa/bbb?引數名='+引數值格式傳遞引數 let self = this; let toPath = '/aaa/bbb?recordedSpeed='+self.recordedSpeed; self.$router.

android通過java層程式呼叫命令列的一些備註

能呼叫哪些命令? 一般性的, 最常用的命令都能呼叫, 比如cat, cp, top, ls, ps命令, 但用法和linux上的有較大區別, 可通過–help/-h查詢具體的命令用法; 我熟知linux terminal命令列, 但如何知道android都有哪些常用命令呢? 首

Android為layout建立子資料

在開發Android專案的時候,往往都有一大批java檔案和layout檔案,java檔案分類比較簡單,直接方法建立資料夾就行,但layout還需要多一步配置。 看最後的檔案結構圖 實現步驟: 1. 建立相應的資料夾結構,需要注意的是,無論如何,佈局檔案的所在的資料

React Native之Android原生通過DeviceEventEmitter傳送訊息給js

1 問題 Android原生向js發訊息,並且可以攜帶資料 2 實現原理 Android原生可以使用RCTEventEmitter來註冊事件,然後這裡需要指定事件的名字,然後在js那端進行監聽同樣事件的名字監聽,就可以收到訊息得到資料 Android註冊關

android通過URL來播放背景音樂

private MediaPlayer mediaPlayer; if(uri!=null) { Uri uri1 = Uri.parse(uri); try { mediaPlayer = new MediaPlayer(

Activity通過Intent傳遞HashMap集合

對於物件在Activity中的傳遞我們仍然可以使用Intent來實現,只是要在傳遞之前需要將Map強制轉化為Serialzable型別(對於自定義的類我們也可以讓其實現Serializable介面)來實

C#通過Type類訪問資料型別資訊

C#中通過Type類可以訪問任意資料型別資訊。 1.獲取給定型別的Type引用有3種方式:    a.使用typeof運算子,如Type t = typeof(int);    b.使用GetType()方法,如int i;Type t = i.GetType();    c.使用Type類的靜態方法GetT

Android通過ListView的實現簡單新聞列表

Android中實現簡單的新聞列表 “本文主要針對Android新手,大神請繞道…” 使用到的第三方庫 Retrofit2+RxJava2 進行網路請和json資料的解析,註解框架:Butterknife 8.5.1 如果以上的框架還有同學不知道怎麼使用可以看看

面試問題之:AndroidListView分頁載入資料

熟悉Android的朋友們都知道,不管是微部落格戶端還是新聞客戶端,都離不開列表元件,可以說列表元件是Android資料展現方面最重要的元件,我們今天就要講一講列表元件ListView載入資料的相關內容。通常來說,一個應用在展現大量資料時,不會將全部的可用資料都呈現給