Android之EventBus

简单使用EventBus的几个步骤。

首先把这个添加到你的工程上去: compile ‘org.greenrobot:eventbus:3.0.0’
这里写图片描述

添加完后,就rebuild下,

我们就实现个SecondActivity更改MainActivity修改textview的值
1,定义一个类 MessageEvent.java

public class MessageEvent {
    private String message;

    public MessageEvent(String message) {
        this.message = message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public String getMessage() {
        return message;
    }
}

2 , MainActivity代码如下:

public class MainActivity extends AppCompatActivity {
    private TextView mTv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        EventBus.getDefault().register(this);//为该Activity注册该事件
        mTv = (TextView) findViewById(R.id.tv);//初始化mTv
    }
    @Subscribe
    public void updateTextViewValue(MessageEvent message) {
        mTv.setText(message.getMessage());
        Toast.makeText(this, "修改成功", Toast.LENGTH_SHORT).show();
    }

    /**
     * 绑定按钮点击事件
     *
     * @param view
     */
    public void onclick(View view) {
        Intent intent = new Intent(this, SecondActivity.class);
        startActivity(intent);//跳到第二个Activity
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        EventBus.getDefault().unregister(this);//取消注册
    }
}

3 , SecondActivity代码:


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

import org.greenrobot.eventbus.EventBus;

public class SecondActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
    }

    /**
     * 绑定按钮点击事件
     * @param view
     */
    public void onclick(View view) {
        EventBus.getDefault().post(new MessageEvent("这是来自secondActivity的消息"));
    }
}

演示效果:
这里写图片描述

好了就是这么简单的使用,这个是根据参数类型调用的。

我们那注解是可以带参数的,有threadMode(线程模式),priority(优先级)

修改后的MainActivity:

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

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

public class MainActivity extends AppCompatActivity {
    private TextView mTv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        EventBus.getDefault().register(this);//为该Activity注册该事件
        mTv = (TextView) findViewById(R.id.tv);//初始化mTv
    }
    @Subscribe(priority = 1)
    public void updateTextViewValue(MessageEvent message) {
        mTv.setText(message.getMessage());
        Toast.makeText(this, "修改成功", Toast.LENGTH_SHORT).show();
    }
    @Subscribe(priority = 2)
     public void getValue1(MessageEvent message){
        Log.i("TAG", "priority = 2 "+message.getMessage());
     }
    @Subscribe(priority = 3)
    public void getValue2(MessageEvent message){
        Log.i("TAG", "priority = 3 "+message.getMessage());
    }
    @Subscribe(priority = 4)
    public void getValue3(MessageEvent message){
        Log.i("TAG", "priority = 4 "+message.getMessage());
    }
    /**
     * 绑定按钮点击事件
     *
     * @param view
     */
    public void onclick(View view) {
        Intent intent = new Intent(this, SecondActivity.class);
        startActivity(intent);//跳到第二个Activity
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        EventBus.getDefault().unregister(this);//取消注册
    }
}

运行结果如下:
这里写图片描述

可以看到,优先级高的先接收到。优先级默认是0,

我们再了解下,threadMode(线程模式)

PostThread 默认实现,执行发生在同一个线程
MainThread 执行在UI 线程上
BackgroundThread 回调发生在非 UI 线程上
Async 永远执行在一个其他的线程上

修改后的MainActivity:

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

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

public class MainActivity extends AppCompatActivity {
    private TextView mTv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        EventBus.getDefault().register(this);//为该Activity注册该事件
        mTv = (TextView) findViewById(R.id.tv);//初始化mTv
    }
    @Subscribe
    public void updateTextViewValue(MessageEvent message) {
        Log.i("TAG", "updateTextViewValue: "+Thread.currentThread().getName()+"线程id"+Thread.currentThread().getId());
        mTv.setText(message.getMessage());
        Toast.makeText(this, "修改成功", Toast.LENGTH_SHORT).show();
    }

    /**
     * 绑定按钮点击事件
     *
     * @param view
     */
    public void onclick(View view) {
        Log.i("TAG", "onclick: "+Thread.currentThread().getName()+"线程id"+Thread.currentThread().getId());
        EventBus.getDefault().post(new MessageEvent(""));
//        Intent intent = new Intent(this, SecondActivity.class);
//        startActivity(intent);//跳到第二个Activity
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        EventBus.getDefault().unregister(this);//取消注册
    }
}

运行结果:
这里写图片描述

可以看到都是运行在主线程。默认的是PostThread,

在 updateTextViewValue方法注解上加上这个@Subscribe(threadMode = ThreadMode.BACKGROUND)

运行结果:
这里写图片描述

可以看到在改了后,就运行在子线程中了,并且也报了个错误

这里写图片描述

知道为什么出错吗,因为子线程不能更改ui。。哈哈

总结:

其他的情况就不演示了,这个框架挺好用的,有了这个框架我们就可以不用intent来传递数据,通过handle来更改ui,用广播发送消息,这些东西完全可以用EventBus来代替。最后给上该框架在github上的地址
https://github.com/greenrobot/EventBus

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值