otto使用心得與存在問題

話不多說,直奔主題。
OTTO是Square推出的事件總線庫類似的庫還有eventbus等,otto的官方地址:https://github.com/square/otto.
1.使用介紹
1.1:首先在項目的build中進行引入:compile ‘com.squareup:otto:+’
1.2:爲了使用方便,通常我們會爲了使用方便新建一個Mybus繼承至Bus,使用單例模式來進行使用,代碼如下:

public class MyBus extends Bus {
    //通過單例模式返回唯一的bus對象,而且重寫父類的post方法,通過handler實現任意線程可以調用
    private Handler mHandler = new Handler(Looper.getMainLooper());
    private static Bus bus = new MyBus();

    private MyBus() {
    }

    public static Bus getInstance() {
        return bus;
    }

    @Override
    public void post(final Object event) {
        if (Looper.myLooper() == Looper.getMainLooper()) {
            super.post(event);
        } else {
            mHandler.post(new Runnable() {
                @Override
                public void run() {
                    MyBus.super.post(event);
                }
            });
        }
    }
}

2.然後創建一個實體類TestUser

public class TestUser {
    private String name;
    private int age;
    public TestUser(String name, int age, int sex) {
        this.name = name;
        this.age = age;
        this.sex = sex;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getSex() {
        return sex;
    }

    public void setSex(int sex) {
        this.sex = sex;
    }

    private int sex;
}

3.在activity裏面進行註冊與發送,發送方式有兩種:
第一種:直接通過post(object o)方法進行發送(貌似我沒成功)

MyBus.getInstance().post(user);

第二種:通過對方法註解Produce(這種方式是成功了的)

@Produce
    public TestUser providerEvent(){
        TestUser eventData = new TestUser("測試",18,1);
        return eventData;
    }
public class WebActivity extends AppCompatActivity {
    TextView webView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_web);
        MyBus.getInstance().register(this);
        webView = (TextView) findViewById(R.id.tv);
        webView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                providerEvent();
//                TestUser user=new TestUser("測試",18,1);
//                MyBus.getInstance().post(user);
                startActivity(new Intent(WebActivity.this, MainActivity.class));
            }
        });
    }

    @Produce
    public TestUser providerEvent(){
        TestUser eventData = new TestUser("測試",18,1);
        return eventData;
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        MyBus.getInstance().unregister(this);
    }
}

4.在接受的activity或者fragment裏面進行註冊,在自定義方法裏面通過@Subscribe進行操作,代碼如下:

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        MyBus.getInstance().register(this);
    }
    @Subscribe
    //這裏的方法名可以隨便寫,只需要@Subscribe就可以了(注意,括號裏面的實體必須是你發送的實體才能接受到數據)
    public void onMyEvent(TestUser user) {    //如果發送的是UserEvent對象則會接收到信息,否則不會
        Log.e("liluo","哈哈哈");
        if (user == null || isFinishing()) {
            return;
        }
        Toast.makeText(this, "姓名:" + user.getName() + "年齡:" + user.getAge(), Toast.LENGTH_LONG).show();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        MyBus.getInstance().unregister(this);
    }
}

好啦,到此基本使用就結束啦!歡迎熟悉者告知爲啥post的方式不能收到消息!謝謝。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章