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
Android中Activity與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 如果以上的框架還有同學不知道怎麼使用可以看看
面試問題之:Android中ListView分頁載入資料
熟悉Android的朋友們都知道,不管是微部落格戶端還是新聞客戶端,都離不開列表元件,可以說列表元件是Android資料展現方面最重要的元件,我們今天就要講一講列表元件ListView載入資料的相關內容。通常來說,一個應用在展現大量資料時,不會將全部的可用資料都呈現給