天天看點

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);
                }
            });
        }
    }
}
           
Otto總線的基本使用

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