EventBus sticky事件

一.前言

相信会有人遇到过这种需求:启动应用进入到首页后,会有一个或若干个网络请求,请求网络获取数据后要更新View。如果此时网络访问有延时,这个时候进入到首页后,View更新便会造成画面更新的闪动,这样用户体验不太好。所以我们一般会引入一个 SplashActivity(启动页)来解决这个问题,将数据初始化操作先放到这里。

那么,现在问题来了: 在 SplashActivity 执行一个后台请求网络获取数据的操作,又怎么将数据发送到首页 MainActivity 呢?

  • 1.用广播 ?假如 MainActivity 还没有 onCreate ,SplashActivity 就发送数据到 MainActivity,广播还能收到消息么 ?

  • 2.用Sticky Broadcast ?嗯,可以的。Sticky Broadcast可以在广播发送结束后保存刚刚发送的广播(Intent),这样当接收者注册完Receiver后就可以接收到刚才已经发布的广播。

    OK,问题已经差不多解决了。但是,用广播会不会未免太重了?

在这里,我无情安利一个非常好用的框架EventBus。它可以很方便的发送一种 sticky 事件,就可以实现粘性广播的效果。在 SplashActivity 发送sticky 事件时,EventBus 会先存储这个 sticky 事件,当接收事件端 MainActivity 加载完成的时候,便会响应这个 sticky 事件。

二、为何要 EventBus:

在使用EventBus时,完全不需要再配置其他东西,例如在Application配置什么。而且发送事件的时候完全不用管接收事件端是什么,也不需要绑定接收事件端。高度解耦,而且在某些场合非常便利:比如activity各种跳转返回的处理、activity 和 多级嵌套 fragment 之间的数据传递。如此优秀的框架便成为了我的理由。

三、EventBus 的简单介绍:

  • EventBus.getDefault().post(object); // 发布事件
  • EventBus.getDefault().register(this); // 订阅事件
  • EventBus.getDefault().unregister(this); // 取消订阅

四、EventBus 实践 【发送sticky事件】:

在 SplashActivity 中隔3秒后启动 MainActivity。在这里模拟一个线程消耗1秒钟获取到数据后发送sticky事件出去。【假如不用sticky事件,则事件接收端由于还没有初始化,接收端将永远收不到消息。】

public class SplashActivity extends Activity{
    private OKManager manager;
    private String json_path = "http://litchiapi.jstv.com/api/GetFeeds?column=17&PageSize=20&pageIndex=1&val=AD908EDAB9C3ED111A58AF86542CCF50";
    private static final String TAG = "SplashActivity";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_splash);
        manager =  OKManager.getInstance();
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                startActivity(new Intent(SplashActivity.this,MainActivity.class));
            }
        },3000);
//        reqNet();

        new Thread(new Runnable() {

            @Override
            public void run() {
                SystemClock.sleep(1000);
                EventBus.getDefault().postSticky(new String("hello"));
            }

        }).start();
    }
}
在 MainActivity 中接收事件。在这里需要注意的是:EventBus.getDefault().register(this);一定要放在控件初始化之后。因为,这句话执行的时候,就会去调用接收订阅方法,如果在控件初始化之前,则会报控件TextView空指针。

public class MainActivity extends AppCompatActivity {

    private TextView mTextView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mTextView = (TextView) findViewById(R.id.text);

        EventBus.getDefault().register(this);
    }

    @Override
    protected void onStart() {
        super.onStart();

    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        EventBus.getDefault().unregister(this);
    }

    @Subscribe(threadMode = ThreadMode.MainThread, sticky = true)
    public void recevice(String event){
        mTextView.setText(event);
    }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值