EventBus 学习,自动刷新首页功能

1.EventBus

1.1 EventBus是什么?

      EventBus由greenrobot组织贡献(该组织还贡献了greenDAO),一个Android事件发布/订阅轻量级框架,下面来一张图作为说明。

                                                                                  EventBus说明

1.2 EventBus优势

  • 我们可以通过解耦发布者和订阅者简化Android事件传递。

  • EventBus可以代替Android传统的Intent、Handler、Broadcast或接口函数,在Fragment,Activity,Service线程之间传递数据,执行方法,而且代码简单。

  • 快,高性能:特别是在注重性能的Android上。也许在其同类的解决方案是最快的。
  • 小(jar包小于50K),但是强大:EventBus是一个很小的库,它的API超级简单。
  • android主线程传递:当和UI交互的时候,无论这个事件是怎么提交的,EventBus都可以在主线程传递事件。

1.3 使用教程

1.3.1 添加依赖

      首先在你的项目中添加eventbus的依赖 

implementation 'org.greenrobot:eventbus:3.1.1'

1.3.2 注册销毁EventBus

      接着,在接收Activity的onCreate()方法中注册EventBus

EventBus.getDefault().register(this);

     其次,在接收Activity的onDestory()中注销EventBus

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

1.3.3 更新UI

值得注意的是,对于接收端更新UI的操作最好在主线程中实现,因为很容易发生崩溃

// 在主线程更新UI
    @Subscribe(threadMode = ThreadMode.MAIN)
    public void Event(String string) {
        textView.setText(string);
    }

1.3.4 完整代码

        接收端activity代码。

public class MainActivity extends AppCompatActivity {

    private Button btnCommon;
    private TextView textView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // 首先要在你要接受EventBus的界面注册,这一步很重要
        EventBus.getDefault().register(this);
        btnCommon = (Button) findViewById(R.id.btn_common);
        textView = (TextView)findViewById(R.id.tv_content);
        textView.setText("今天是星期五!");
        jumpActivity();
    }

    private void jumpActivity() {
        btnCommon.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(MainActivity.this, CommonActivity.class);
                startActivity(intent);
            }
        });
    }
    
    // 在主线程更新UI
    @Subscribe(threadMode = ThreadMode.MAIN)
    public void Event(String string) {
        textView.setText(string);
    }

    // 注销EventBus
    @Override
    protected void onDestroy() {
        super.onDestroy();
        if(EventBus.getDefault().isRegistered(this)) {
            EventBus.getDefault().unregister(this);
        }
    }
}

下面在看发送端,我们在点击事件中,加入一个EventBus事件,进行传值。

public class CommonActivity extends AppCompatActivity {
    private Button button;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.second_activity);
        button = (Button) findViewById(R.id.btn2);
        jumpActivity();
    }

    private void jumpActivity() {
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                EventBus.getDefault().post("欢迎大家!");
                finish();
            }
        });
    }
}

1.3.5 效果展示

       第一个界面是接收Activity,第二个界面是发送Activity,在第二个界面点击“进入跳转到首页”按钮,会用EventBus传递需要更新的UI数据,并跳转到第一个页面。回到第一个页面,EventBus接收,完成刷新UI操作。

刷新首页功能

       在实际开发中,我们经常会遇到这种需求:即在某一个模块,完成某一操作后。然后在首页会进行要求同步显示,进行UI更新。这要求实现首页实时刷新功能。针对这一需求,我考虑采用EventBus去实现。那么怎么实现呢,请您继续阅读。

2.1 需求分析

由于前端的数据都是请求后台接口得到的,进而更新展示对应的UI,那么刷新流程为:

  1. 在特定页面完成操作后,可以发送一个更新指令给首页
  2. 首页接收指令后,首页调用上拉,下拉方法
  3. 执行上拉下拉方法的过程中,向后台对应接口进行请求,更新数据
  4. 更新数据后,改变UI,实现刷新功能

2.2 实现代码

利用EventBus,我们可以在操作页面向首页发送一个参数,告诉首页进行刷新操作。主要代码逻辑如下:

private void gameFinish() {
    //发送消息首页刷新状态
    EventBusBean eventBusBean = new EventBusBean();
    eventBusBean.setCode(EventBusConstant.TASK_REFRESH_CODE);
    EventBus.getDefault().post(eventBusBean);
    try {
      // todo 
      // 逻辑操作
    } 
    catch (Exception e) {
        e.printStackTrace();   
    }
    // todo 关闭页面操作
  }

          在首页接收中,我们在在主线程中执行刷新操作,进而实现同步更新内容。

/**
 * 接收传递来的数据进行刷新
 * @param eventBusBean 数据
 */
@Subscribe(threadMode = ThreadMode.MAIN)
public void getOnEvent(EventBusBean eventBusBean) {
    if (eventBusBean.getCode() == EventBusConstant.TASK_REFRESH_CODE) {
        if (checkSubjectBean != null) {
            page = 1;
            mSRefreshLayout.autoRefresh();
        }
    }
}

        值得一说的是,在上面代码中 EventBusConstant.TASK_REFRESH_CODE 是我设置的一个完成标志,这个参数首页接收到后,就执行刷新方法,重新进行网络请求,实现刷新功能。

参考文献

https://www.jianshu.com/p/1e8191bc7bc2

发布了51 篇原创文章 · 获赞 97 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/m0_37218227/article/details/83718295