安卓EventBus3.0使用讲解(一)

什么是EventBus


  EventBus是一个Android端优化的publish/subscribe消息总线,简化了应用程序内各组件间、组件与后台线程间的通信。比如请求网络,等网络返回时通过Handler或Broadcast通知UI,两个Fragment之间需要通过Listener通信,这些需求都可以通过EventBus实现。

基本用法


  很多文章会讲到Subscriber,以及Publisher和ThreadMode等概念,我觉得暂时没有必要,简单粗暴,直接上代码:

添加依赖库
首先你要为你的app添加依赖库:

compile 'de.greenrobot:eventbus:3.0.0-beta1'

注册

 需要在一个activity中注册eventbus事件,然后定义接收方法,这和Android的广播机制很像,你需要首先注册广播,然后需要编写内部类,实现接收广播,然后操作UI,在EventBus中,你同样需要这么做。

  @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        this.tvdatas = (TextView) findViewById(R.id.tv_datas);
        this.tvnormal = (TextView) findViewById(R.id.tv_normal);
        EventBus.getDefault().register(this);
    }

订阅者

类似广播,但是有别于2.4版本,你不必再去约定OnEvent方法开头了:

  //设置普通数据
    @Subscribe(threadMode = ThreadMode.MAIN)
    public void setTv(String message){
        tvnormal.setText(message);
    }

该操作很简单,定义了一个setTv方法,需要传入String参数,在其中操作UI操作

注意:我们添加了注解@Subscribe,其含义为订阅者,在其内传入了threadMode

我们定义为ThreadMode.MainThread,其含义为该方法在UI线程完成

发布者

既然你在某个地方订阅了内容,当然就会在某个地方发布消息。举个例子,你的这个activity需要联网请求数据

联网请求数据,你肯定是在异步线程中操作,其返回结果后,你可以这么写:


String message = "这是普通的文本消息";
 EventBus.getDefault().post(message);

接下来演示一个案例,很简单,有两个Activity通过EventBus传递数据

首先上图



1>MainActivity代码

注册了两个设置TextView

package com.example.allan.eventbus;

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.TextView;

import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    
    private android.widget.TextView tvnormal;
    private android.widget.TextView tvdatas;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        this.tvdatas = (TextView) findViewById(R.id.tv_datas);
        this.tvnormal = (TextView) findViewById(R.id.tv_normal);
        EventBus.getDefault().register(this);
    }

    //设置普通数据
    @Subscribe(threadMode = ThreadMode.MAIN)
    public void setTv(String message){
        tvnormal.setText(message);
    }

    //设置javabean
    @Subscribe(threadMode = ThreadMode.MAIN)
    public void setMessage(DataBean datas){
        tvdatas.setText(datas.name +" "+ datas.password);
    }

   public void onClick(View view){
      startActivity(new Intent(MainActivity.this,Main2Activity.class));
   }

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

}

2>Main2Activity代码

package com.example.allan.eventbus;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

import org.greenrobot.eventbus.EventBus;

public class Main2Activity extends AppCompatActivity {

    String message = "这是普通的文本消息";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        EventBus.getDefault().post(message);
        EventBus.getDefault().post(new DataBean("李四","1234"));
        finish();
    }
}

xml  file



<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.example.allan.eventbus.MainActivity">

    <TextView
        android:layout_marginTop="30dp"
        android:id="@+id/tv_normal"
        android:gravity="center"
        android:textSize="20sp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="EventBus 普通信息"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/tv_datas"
        android:layout_width="wrap_content"
        android:layout_gravity="center"
        android:layout_height="wrap_content"
        android:textColor="#ff00"
        android:layout_margin="30dp"
        android:textSize="20sp"
        android:text="EventBus 数据"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:text="获取数据"
        android:onClick="onClick"/>

</LinearLayout>


猜你喜欢

转载自blog.csdn.net/Allan_Bst/article/details/72803956