日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

Android之EventBus使用详解

發(fā)布時(shí)間:2025/3/21 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android之EventBus使用详解 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、概述

當(dāng)Android項(xiàng)目越來(lái)越龐大的時(shí)候,應(yīng)用的各個(gè)部件之間的通信變得越來(lái)越復(fù)雜,例如:當(dāng)某一條件發(fā)生時(shí),應(yīng)用中有幾個(gè)部件對(duì)這個(gè)消息感興趣,那么我們通常采用的就是觀察者模式,使用觀察者模式有一個(gè)弊病就是部件之間的耦合度太高,在這里我將會(huì)詳細(xì)介紹Android中的解耦組建EventBus的使用。EventBus是一款針對(duì)Android優(yōu)化的發(fā)布/訂閱事件總線。主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,線程之間傳遞消息.優(yōu)點(diǎn)是開(kāi)銷小,代碼更優(yōu)雅。以及將發(fā)送者和接收者解耦。

?

1、EvnetBus的下載地址:https://github.com/greenrobot/EventBus.git

?

2、基本使用

(1)自定義一個(gè)類,可以是空類,比如:

?

[java]?view plain
  • public?class?AnyEventType?{??
  • ?????public?AnyEventType(){}??
  • ?}??
  • ?

    (2)在要接收消息的頁(yè)面注冊(cè):

    ?

    [java]?view plain
  • eventBus.register(this);??
  • ?

    (3)發(fā)送消息

    ?

    [java]?view plain
  • eventBus.post(new?AnyEventType?event);??
  • (4)接受消息的頁(yè)面實(shí)現(xiàn)(共有四個(gè)函數(shù),各功能不同,這是其中之一,可以選擇性的實(shí)現(xiàn),這里先實(shí)現(xiàn)一個(gè)):

    ?

    [java]?view plain
  • public?void?onEvent(AnyEventType?event)?{}??
  • (5)解除注冊(cè)

    [java]?view plain
  • eventBus.unregister(this);??
  • 順序就是這么個(gè)順序,可真正讓自己寫,估計(jì)還是云里霧里的,下面舉個(gè)例子來(lái)說(shuō)明下。

    ?

    首先,在EventBus中,獲取實(shí)例的方法一般是采用EventBus.getInstance()來(lái)獲取默認(rèn)的EventBus實(shí)例,當(dāng)然你也可以new一個(gè)又一個(gè),個(gè)人感覺(jué)還是用默認(rèn)的比較好,以防出錯(cuò)。

    ?

    二、實(shí)戰(zhàn)

    先給大家看個(gè)例子:

    ?

    當(dāng)擊btn_try按鈕的時(shí)候,跳到第二個(gè)Activity,當(dāng)點(diǎn)擊第二個(gè)activity上面的First Event按鈕的時(shí)候向第一個(gè)Activity發(fā)送消息,當(dāng)?shù)谝粋€(gè)Activity收到消息后,一方面將消息Toast顯示,一方面放入textView中顯示。

    按照下面的步驟,下面來(lái)建這個(gè)工程:

    1、基本框架搭建

    想必大家從一個(gè)Activity跳轉(zhuǎn)到第二個(gè)Activity的程序應(yīng)該都會(huì)寫,這里先稍稍把兩個(gè)Activity跳轉(zhuǎn)的代碼建起來(lái)。后面再添加EventBus相關(guān)的玩意。

    MainActivity布局(activity_main.xml)

    ?

    [html]?view plain
  • <LinearLayout?xmlns:android="http://schemas.android.com/apk/res/android"??
  • ????xmlns:tools="http://schemas.android.com/tools"??
  • ????android:layout_width="match_parent"??
  • ????android:layout_height="match_parent"??
  • ????android:orientation="vertical">??
  • ??????
  • ????<Button???
  • ????????android:id="@+id/btn_try"??
  • ????????android:layout_width="match_parent"??
  • ????????android:layout_height="wrap_content"??
  • ????????android:text="btn_bty"/>??
  • ????<TextView???
  • ????????android:id="@+id/tv"??
  • ????????android:layout_width="wrap_content"??
  • ????????android:layout_height="match_parent"/>??
  • ??
  • </LinearLayout>??
  • 新建一個(gè)Activity,SecondActivity布局(activity_second.xml)

    [html]?view plain
  • <LinearLayout?xmlns:android="http://schemas.android.com/apk/res/android"??
  • ????xmlns:tools="http://schemas.android.com/tools"??
  • ????android:layout_width="match_parent"??
  • ????android:layout_height="match_parent"??
  • ????android:orientation="vertical"??
  • ????tools:context="com.harvic.try_eventbus_1.SecondActivity"?>??
  • ??
  • ????<Button???
  • ????????android:id="@+id/btn_first_event"??
  • ????????android:layout_width="match_parent"??
  • ????????android:layout_height="wrap_content"??
  • ????????android:text="First?Event"/>??
  • ??
  • </LinearLayout>??
  • MainActivity.java (點(diǎn)擊btn跳轉(zhuǎn)到第二個(gè)Activity)

    [java]?view plain
  • public?class?MainActivity?extends?Activity?{??
  • ??
  • ????Button?btn;??
  • ??
  • ????@Override??
  • ????protected?void?onCreate(Bundle?savedInstanceState)?{??
  • ????????super.onCreate(savedInstanceState);??
  • ????????setContentView(R.layout.activity_main);??
  • ??
  • ????????btn?=?(Button)?findViewById(R.id.btn_try);??
  • ??
  • ????????btn.setOnClickListener(new?View.OnClickListener()?{??
  • ??
  • ????????????@Override??
  • ????????????public?void?onClick(View?v)?{??
  • ????????????????//?TODO?Auto-generated?method?stub??
  • ????????????????Intent?intent?=?new?Intent(getApplicationContext(),??
  • ????????????????????????SecondActivity.class);??
  • ????????????????startActivity(intent);??
  • ????????????}??
  • ????????});??
  • ????}??
  • ??
  • }??
  • 到這,基本框架就搭完了,下面開(kāi)始按步驟使用EventBus了。

    2、新建一個(gè)類FirstEvent

    ?

    [java]?view plain
  • package?com.harvic.other;??
  • ??
  • public?class?FirstEvent?{??
  • ??
  • ????private?String?mMsg;??
  • ????public?FirstEvent(String?msg)?{??
  • ????????//?TODO?Auto-generated?constructor?stub??
  • ????????mMsg?=?msg;??
  • ????}??
  • ????public?String?getMsg(){??
  • ????????return?mMsg;??
  • ????}??
  • }??
  • 這個(gè)類很簡(jiǎn)單,構(gòu)造時(shí)傳進(jìn)去一個(gè)字符串,然后可以通過(guò)getMsg()獲取出來(lái)。

    ?

    3、在要接收消息的頁(yè)面注冊(cè)EventBus:

    在上面的GIF圖片的演示中,大家也可以看到,我們是要在MainActivity中接收發(fā)過(guò)來(lái)的消息的,所以我們?cè)贛ainActivity中注冊(cè)消息。

    通過(guò)我們會(huì)在OnCreate()函數(shù)中注冊(cè)EventBus,在OnDestroy()函數(shù)中反注冊(cè)。所以整體的注冊(cè)與反注冊(cè)的代碼如下:

    ?

    [java]?view plain
  • package?com.example.tryeventbus_simple;??
  • ??
  • import?com.harvic.other.FirstEvent;??
  • ??
  • import?de.greenrobot.event.EventBus;??
  • import?android.app.Activity;??
  • import?android.content.Intent;??
  • import?android.os.Bundle;??
  • import?android.util.Log;??
  • import?android.view.View;??
  • import?android.widget.Button;??
  • import?android.widget.TextView;??
  • import?android.widget.Toast;??
  • ??
  • public?class?MainActivity?extends?Activity?{??
  • ??
  • ????Button?btn;??
  • ????TextView?tv;??
  • ??
  • ????@Override??
  • ????protected?void?onCreate(Bundle?savedInstanceState)?{??
  • ????????super.onCreate(savedInstanceState);??
  • ????????setContentView(R.layout.activity_main);??
  • ????????????????//注冊(cè)EventBus??
  • ????????EventBus.getDefault().register(this);??
  • ??
  • ????????btn?=?(Button)?findViewById(R.id.btn_try);??
  • ????????tv?=?(TextView)findViewById(R.id.tv);??
  • ??
  • ????????btn.setOnClickListener(new?View.OnClickListener()?{??
  • ??
  • ????????????@Override??
  • ????????????public?void?onClick(View?v)?{??
  • ????????????????//?TODO?Auto-generated?method?stub??
  • ????????????????Intent?intent?=?new?Intent(getApplicationContext(),??
  • ????????????????????????SecondActivity.class);??
  • ????????????????startActivity(intent);??
  • ????????????}??
  • ????????});??
  • ????}??
  • ????@Override??
  • ????protected?void?onDestroy(){??
  • ????????super.onDestroy();??
  • ????????EventBus.getDefault().unregister(this);//反注冊(cè)EventBus??
  • ????}??
  • }??
  • 4、發(fā)送消息

    發(fā)送消息是使用EventBus中的Post方法來(lái)實(shí)現(xiàn)發(fā)送的,發(fā)送過(guò)去的是我們新建的類的實(shí)例!

    ?

    [java]?view plain
  • EventBus.getDefault().post(new?FirstEvent("FirstEvent?btn?clicked"));??
  • 完整的SecondActivity.java的代碼如下:

    ?

    [java]?view plain
  • package?com.example.tryeventbus_simple;??
  • ??
  • import?com.harvic.other.FirstEvent;??
  • ??
  • import?de.greenrobot.event.EventBus;??
  • import?android.app.Activity;??
  • import?android.os.Bundle;??
  • import?android.view.View;??
  • import?android.widget.Button;??
  • ??
  • public?class?SecondActivity?extends?Activity?{??
  • ????private?Button?btn_FirstEvent;??
  • ??
  • ????@Override??
  • ????protected?void?onCreate(Bundle?savedInstanceState)?{??
  • ????????super.onCreate(savedInstanceState);??
  • ????????setContentView(R.layout.activity_second);??
  • ????????btn_FirstEvent?=?(Button)?findViewById(R.id.btn_first_event);??
  • ??
  • ????????btn_FirstEvent.setOnClickListener(new?View.OnClickListener()?{??
  • ??
  • ????????????@Override??
  • ????????????public?void?onClick(View?v)?{??
  • ????????????????//?TODO?Auto-generated?method?stub??
  • ????????????????EventBus.getDefault().post(??
  • ????????????????????????new?FirstEvent("FirstEvent?btn?clicked"));??
  • ????????????}??
  • ????????});??
  • ????}??
  • }??
  • 5、接收消息

    接收消息時(shí),我們使用EventBus中最常用的onEventMainThread()函數(shù)來(lái)接收消息,具體為什么用這個(gè),我們下篇再講,這里先給大家一個(gè)初步認(rèn)識(shí),要先能把EventBus用起來(lái)先。

    ?

    在MainActivity中重寫onEventMainThread(FirstEvent event),參數(shù)就是我們自己定義的類:

    在收到Event實(shí)例后,我們將其中攜帶的消息取出,一方面Toast出去,一方面?zhèn)鞯絋extView中;

    [java]?view plain
  • public?void?onEventMainThread(FirstEvent?event)?{??
  • ??
  • ????String?msg?=?"onEventMainThread收到了消息:"?+?event.getMsg();??
  • ????Log.d("harvic",?msg);??
  • ????tv.setText(msg);??
  • ????Toast.makeText(this,?msg,?Toast.LENGTH_LONG).show();??
  • }??
  • 完整的MainActiviy代碼如下:

    ?

    [java]?view plain
  • package?com.example.tryeventbus_simple;??
  • ??
  • import?com.harvic.other.FirstEvent;??
  • ??
  • import?de.greenrobot.event.EventBus;??
  • import?android.app.Activity;??
  • import?android.content.Intent;??
  • import?android.os.Bundle;??
  • import?android.util.Log;??
  • import?android.view.View;??
  • import?android.widget.Button;??
  • import?android.widget.TextView;??
  • import?android.widget.Toast;??
  • ??
  • public?class?MainActivity?extends?Activity?{??
  • ??
  • ????Button?btn;??
  • ????TextView?tv;??
  • ??
  • ????@Override??
  • ????protected?void?onCreate(Bundle?savedInstanceState)?{??
  • ????????super.onCreate(savedInstanceState);??
  • ????????setContentView(R.layout.activity_main);??
  • ??
  • ????????EventBus.getDefault().register(this);??
  • ??
  • ????????btn?=?(Button)?findViewById(R.id.btn_try);??
  • ????????tv?=?(TextView)findViewById(R.id.tv);??
  • ??
  • ????????btn.setOnClickListener(new?View.OnClickListener()?{??
  • ??
  • ????????????@Override??
  • ????????????public?void?onClick(View?v)?{??
  • ????????????????//?TODO?Auto-generated?method?stub??
  • ????????????????Intent?intent?=?new?Intent(getApplicationContext(),??
  • ????????????????????????SecondActivity.class);??
  • ????????????????startActivity(intent);??
  • ????????????}??
  • ????????});??
  • ????}??
  • ??
  • ????public?void?onEventMainThread(FirstEvent?event)?{??
  • ??
  • ????????String?msg?=?"onEventMainThread收到了消息:"?+?event.getMsg();??
  • ????????Log.d("harvic",?msg);??
  • ????????tv.setText(msg);??
  • ????????Toast.makeText(this,?msg,?Toast.LENGTH_LONG).show();??
  • ????}??
  • ??
  • ????@Override??
  • ????protected?void?onDestroy(){??
  • ????????super.onDestroy();??
  • ????????EventBus.getDefault().unregister(this);??
  • ????}??
  • }
  • 轉(zhuǎn):http://blog.csdn.net/harvic880925/article/details/40660137?

    轉(zhuǎn)載于:https://www.cnblogs.com/xijin-wu/p/5293212.html

    《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

    總結(jié)

    以上是生活随笔為你收集整理的Android之EventBus使用详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。