【第二篇】学习 android 事件总线androidEventbus之异步事件的传递
1,不同Activity直接发送Ansy的事件,以及其他任何事件,必须通过
postSticky方式来进行事件的传递,而不能通过post的形式来进行传递:EventBus.getDefault().postSticky(newUser("soyoungboy","西安财经学院"),
"soyoungboy");。
2,接受到事件后,很有必要移除事件里面的内容,否则事件内容会多次叠加:EventBus.getDefault().removeStickyEvent(user.getClass(),"ansy") [貌似这个问题只出现在多个Activity之间的事件发送和接收有这问题,但是单个activity里面不会存在这个问题]。
3,接收事件相应的时候:除了tag以外还要加上mode,mode =mode =ThreadMode.ASYNC.
4,当然tag可以不用设置,但是发送和接收必须统一,要么都加上,要么都不加。
下面是两个activity之间的ansy事件传递:
-
package com.example.mysimpleeventbus; import org.simple.eventbus.EventBus; import org.simple.eventbus.Subscriber; import org.simple.eventbus.ThreadMode; import android.content.Intent; import android.os.Bundle; import android.support.v7.app.ActionBarActivity; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class MainActivity extends ActionBarActivity implements OnClickListener { private Button button; private Button ansyBtn; private Button ansy1Btn; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); // 1 首先注册事件总线 EventBus.getDefault().register(this); } private void initView() { button = (Button) findViewById(R.id.button); ansyBtn = (Button) findViewById(R.id.ansyBtn); ansy1Btn = (Button) findViewById(R.id.ansy1Btn); button.setOnClickListener(this); ansyBtn.setOnClickListener(this); ansy1Btn.setOnClickListener(this); } @Override protected void onDestroy() { super.onDestroy(); EventBus.getDefault().unregister(this); } @Override public void onClick(View view) { switch (view.getId()) { case R.id.button: postSticky(); break; case R.id.ansyBtn: postAnsy(); break; case R.id.ansy1Btn: postAnsyInMainActivity(); break; default: break; } } /** * Ansy事件传递,多个Activity之间必须postSticky */ private void postAnsy() { // 将目标函数执行在异步线程中 EventBus.getDefault().postSticky(new User("soyoungboy", "西安财经学院"), "ansy"); gotoOtherActivity(); } /** * 在本Activity中进行Ansy事件发布操作 */ private void postAnsyInMainActivity() { EventBus.getDefault().post(new User("soyoungboy", "西安财经学院"), "ansy"); } /** * 在本Activity中进行Ansy事件接受操作 * * @param user */ @Subscriber(tag = "ansy", mode = ThreadMode.ASYNC) private void ansy(User user) { Log.i("user", user.toString()); Log.i("ThreadName", Thread.currentThread().getName()); } private void postSticky() { // 2 发送Sticky事件 EventBus.getDefault().postSticky(new User("soyoungboy", "西安财经学院"), "soyoungboy"); gotoOtherActivity(); } private void gotoOtherActivity() { // 跳转页面 Intent intent = new Intent(MainActivity.this, OtherActivity.class); startActivity(intent); } }
OtherActivity.java
-
1 package com.example.mysimpleeventbus; 2 3 import org.simple.eventbus.EventBus; 4 import org.simple.eventbus.Subscriber; 5 import org.simple.eventbus.ThreadMode; 6 7 import android.app.Activity; 8 import android.os.Bundle; 9 import android.util.Log; 10 import android.widget.Toast; 11 12 public class OtherActivity extends Activity { 13 @Override 14 protected void onCreate(Bundle savedInstanceState) { 15 // TODO Auto-generated method stub 16 super.onCreate(savedInstanceState); 17 setContentView(R.layout.activity_main); 18 // 注意此处的registerSticky而不是register 19 EventBus.getDefault().registerSticky(this); 20 } 21 22 // 此处获取发送事件的内容 23 @Subscriber(tag = "soyoungboy") 24 void showToast(User user) { 25 Toast.makeText(OtherActivity.this, user.toString(), Toast.LENGTH_LONG) 26 .show(); 27 } 28 29 // 获取Ansy异步事件的内容 30 @Subscriber(tag = "ansy",mode = ThreadMode.ASYNC) 31 private void ansy(User user) { 32 Log.i("user", user.toString()); 33 Log.i("ThreadName", Thread.currentThread().getName()); 34 //删除事件,否则会出现重复的响应事件 35 EventBus.getDefault().removeStickyEvent(user.getClass(), "ansy"); 36 } 37 38 @Override 39 protected void onDestroy() { 40 super.onDestroy(); 41 // 同样需要unregister 42 EventBus.getDefault().unregister(this); 43 } 44 }
同一个activity内部的内容传递,事件内容不会多次叠加,所以无需删除的操作:
1 package com.example.mysimpleeventbus; 2 3 import org.simple.eventbus.EventBus; 4 import org.simple.eventbus.Subscriber; 5 import org.simple.eventbus.ThreadMode; 6 7 import android.content.Intent; 8 import android.os.Bundle; 9 import android.support.v7.app.ActionBarActivity; 10 import android.util.Log; 11 import android.view.View; 12 import android.view.View.OnClickListener; 13 import android.widget.Button; 14 15 public class MainActivity extends ActionBarActivity implements OnClickListener { 16 17 private Button button; 18 private Button ansyBtn; 19 private Button ansy1Btn; 20 21 @Override 22 protected void onCreate(Bundle savedInstanceState) { 23 super.onCreate(savedInstanceState); 24 setContentView(R.layout.activity_main); 25 initView(); 26 // 1 首先注册事件总线 27 EventBus.getDefault().register(this); 28 } 29 30 private void initView() { 31 button = (Button) findViewById(R.id.button); 32 ansyBtn = (Button) findViewById(R.id.ansyBtn); 33 ansy1Btn = (Button) findViewById(R.id.ansy1Btn); 34 35 button.setOnClickListener(this); 36 ansyBtn.setOnClickListener(this); 37 ansy1Btn.setOnClickListener(this); 38 } 39 40 @Override 41 protected void onDestroy() { 42 super.onDestroy(); 43 EventBus.getDefault().unregister(this); 44 } 45 46 @Override 47 public void onClick(View view) { 48 switch (view.getId()) { 49 case R.id.button: 50 51 postSticky(); 52 53 break; 54 55 case R.id.ansyBtn: 56 57 postAnsy(); 58 59 break; 60 case R.id.ansy1Btn: 61 62 postAnsyInMainActivity(); 63 64 break; 65 default: 66 break; 67 } 68 } 69 70 /** 71 * Ansy事件传递,多个Activity之间必须postSticky 72 */ 73 private void postAnsy() { 74 // 将目标函数执行在异步线程中 75 EventBus.getDefault().postSticky(new User("soyoungboy", "西安财经学院"), 76 "ansy"); 77 gotoOtherActivity(); 78 } 79 80 /** 81 * 在本Activity中进行Ansy事件发布操作 82 */ 83 private void postAnsyInMainActivity() { 84 EventBus.getDefault().post(new User("soyoungboy", "西安财经学院"), "ansy"); 85 } 86 87 /** 88 * 在本Activity中进行Ansy事件接受操作 89 * 90 * @param user 91 */ 92 @Subscriber(tag = "ansy", mode = ThreadMode.ASYNC) 93 private void ansy(User user) { 94 Log.i("user", user.toString()); 95 Log.i("ThreadName", Thread.currentThread().getName()); 96 } 97 98 private void postSticky() { 99 // 2 发送Sticky事件 100 EventBus.getDefault().postSticky(new User("soyoungboy", "西安财经学院"), 101 "soyoungboy"); 102 103 gotoOtherActivity(); 104 } 105 106 private void gotoOtherActivity() { 107 // 跳转页面 108 Intent intent = new Intent(MainActivity.this, OtherActivity.class); 109 startActivity(intent); 110 } 111 }