【第二篇】学习 android 事件总线androidEventbus之异步事件的传递

时间:2021-08-06 22:48:18
【第二篇】学习 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事件传递:
  1. 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;
    
     import org.simple.eventbus.EventBus;
    import org.simple.eventbus.Subscriber;
    import org.simple.eventbus.ThreadMode; import android.app.Activity;
    import android.os.Bundle;
    import android.util.Log;
    import android.widget.Toast; public class OtherActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    // 注意此处的registerSticky而不是register
    EventBus.getDefault().registerSticky(this);
    } // 此处获取发送事件的内容
    @Subscriber(tag = "soyoungboy")
    void showToast(User user) {
    Toast.makeText(OtherActivity.this, user.toString(), Toast.LENGTH_LONG)
    .show();
    } // 获取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 }

    @Override
    protected void onDestroy() {
    super.onDestroy();
    // 同样需要unregister
    EventBus.getDefault().unregister(this);
    }
    }



同一个activity内部的内容传递,事件内容不会多次叠加,所以无需删除的操作:
 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();
} /**
81 * 在本Activity中进行Ansy事件发布操作
82 */
83 private void postAnsyInMainActivity() {
84 EventBus.getDefault().post(new User("soyoungboy", "西安财经学院"), "ansy");
85 }

/**
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 }

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);
}
}