Otto总线的基本使用

Otto,与EventBus的使用相似,能在线程间传递数据
一般可以用来代替handler进行数据的传递,可以进行一对多的数据发送,这可以满足有些应用场景。其中Bus对象可以定义为全局的。

一般使用步骤

1.
注册接受者,接受者一般可以在Activity或Fragment
接受者接受数据,用@Subscribe注解
注解下的方法接受的参数就是发布者发送的参数,参数类型要相同或是发布者的父类

public class MainActivity extends AppCompatActivity {
    private Button mButton;
    private TextView mTextView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //注册接受者
        App.getMainThreadBusInstance().register(this);
        mButton = (Button) findViewById(R.id.second);
        mTextView = (TextView) findViewById(R.id.receiver);
        mButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this, SecondActivity.class);
                startActivity(intent);
            }
        });
    }

    /**
     * 接受者
     * @param o
     */
    @Subscribe
    public void getMessage(Object o) {
        if (mTextView != null) {
            mTextView.setText((String) o);
            Toast.makeText(MainActivity.this, "first activity textview's content change", Toast.LENGTH_SHORT).show();
        }
    }

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

2、创建发送者,发送数据 ,在要发送的地方调用Bus.post(event),event可以是任意类型

public class SecondActivity extends AppCompatActivity {

    private EditText mEditText;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        Button bUtton = (Button) findViewById(R.id.post);
        mEditText = (EditText) findViewById(R.id.edit);
        bUtton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String trim = mEditText.getText().toString().trim();
                //发送消息,这里是全局的Bus,bus是集成后重写的可以在主线程中运行的Bus
                App.getMainThreadBusInstance().post(trim);
            }
        });
    }
}

另:定义一直在接受者可以在主线程得到数据的Bus

public class MainThreadBus extends Bus {
    private final Handler mHandler = new Handler(Looper.getMainLooper());

    @Override
    public void post(final Object event) {
        //判断是否是主线程looper,就是本线程是否是主线程
        if (Looper.myLooper() == Looper.getMainLooper()) {
            super.post(event);
        } else {
            mHandler.post(new Runnable() {
                @Override
                public void run() {
                    MainThreadBus.super.post(event);
                }
            });
        }
    }
}

Demo结果,从第二个Activity中返回数据显示在第一个Activity的TextView中

demo源码:https://github.com/RosesJack/OttoDemo

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值