Android中EventBus詳解

一、介紹

EventBus是一款針對Android優化的發佈/訂閱事件總線,他的主要功能的代替Intent,Handler,BroadCast在Service,Activity,Fragment中進行通信傳遞消息,他的優點是開銷小,代碼優雅簡潔,易上手。

1、EventBus的開源庫

源碼:https://github.com/greenrobot/EventBus

2、基本使用方法

(1)自定義一個消息內容類

(2)在接收消息頁面進行註冊

(3)發送消息

(4)接收消息的頁面實現(注意:實現方法有四個)

(5)在接收消息的頁面解除註冊

3、詳解四個實現方法

(1)public void onEvent(MsgEvent1 msg)

如果使用onEvent作爲訂閱函數,那麼該事件在哪個線程發佈出來的,onEvent就會在哪個線程中運行,發佈事件和接收事件處於同一個線程。注意:使用此方法時,在onEvent方法中不能執行耗時的操作。

(2)public void onEventMainThread(MsgEvent1 msg)

如果使用onEventMainThread作爲訂閱函數,那麼無論該事件是從哪個線程發佈出來的,onEventMainThread都會在UI線程中執行。注意:1、Android只能在UI線程中更新UI;2、使用此方法時,在onEventMainThread方法中不能執行耗時的操作。

(3)public void onEventBackgroundThread(MsgEvent1 msg)

如果使用onEventBackgroundThread作爲訂閱函數,那麼如果該事件是在UI線程中發佈出來的,那麼onEventBackgroundThread就會在子線程中執行;如果該事件是在子線程中發佈出來的,那麼onEventBackgroundThread直接在該子線程中執行。

(4)public void onEventAsync(MsgEvent1 msg)

如果使用onEventAsync作爲訂閱函數,那麼無論該事件是哪個線程發佈的,都會在創建一個新的子線程中執行。

二、實戰

1、示例:

(1)、進入第一個面,模擬從服務器拿數據,拿到數據後更新UI;

(2)、第一個頁面展示的多個人員信息,點擊其中某一個進入到第二個頁面,在第二個頁面進行修改相關數據後,第一個頁面的數據自動保存替換並更新UI;


2、搭建:

首頁代碼,實現了第一次進入延遲模擬獲取網絡數據,然後進行UI渲染

package com.tb.eventbusdemo.activity;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.ProgressBar;

import com.tb.eventbusdemo.R;
import com.tb.eventbusdemo.activity.module.User;

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

import java.util.ArrayList;


/**
 * Created by tangbin on 16/6/14.
 */
public class MainActivity extends Activity implements AdapterView.OnItemClickListener {
    private ListView lv_users;
    private UserAdapter userAdapter;
    private ProgressBar progressBar;
    private Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            if (msg.what == 0) {
                ArrayList<User> users = getUsers();
                EventBus.getDefault().post(users);
            }
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        EventBus.getDefault().register(this);

        lv_users = (ListView) findViewById(R.id.lv_users);
        progressBar = (ProgressBar) findViewById(R.id.progressBar);

        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(2000); // 模擬延時
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                mHandler.sendEmptyMessage(0);
            }
        }).start();
        lv_users.setOnItemClickListener(this);
    }


    @Subscribe
    public void onEventPostThread(ArrayList<User> users) {
        userAdapter = new UserAdapter(this, users);
        lv_users.setAdapter(userAdapter);
        progressBar.setVisibility(View.GONE);
    }

    @Subscribe
    public void onEventPostThread(User u) {
        for (User s : userAdapter.getUsers()) {
            if (s.equals(u)) {
                int po = userAdapter.getUsers().indexOf(s);
                userAdapter.getUsers().set(po, u);
                break;
            }
        }
        userAdapter.notifyDataSetChanged();
    }

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

    @Override
    protected void onPause() {
        super.onPause();
    }

    @Override
    protected void onResume() {
        super.onResume();
    }

    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        Intent i = new Intent();
        i.setClass(this, UserInfoDetailActicity.class);
        i.putExtra("user", (User) userAdapter.getItem(position));
        startActivity(i);
    }

    private ArrayList<User> getUsers() {
        ArrayList<User> users = new ArrayList<>();
        User user = new User();
        user.setId("1");
        user.setName("張三");
        user.setAge("28歲");
        user.setSex("女");
        user.setBirthday("1990-1-2");
        users.add(user);

        User user1 = new User();
        user1.setId("2");
        user1.setName("李四");
        user1.setAge("23歲");
        user1.setBirthday("1930-2-3");
        user1.setSex("女");
        users.add(user1);

        User user2 = new User();
        user2.setId("3");
        user2.setName("王五");
        user2.setAge("24歲");
        user2.setSex("男");
        user2.setBirthday("3990-5-6");
        users.add(user2);

        User user3 = new User();
        user3.setId("4");
        user3.setName("趙六");
        user3.setAge("22歲");
        user3.setBirthday("1930-12-11");
        user3.setSex("女");
        users.add(user3);

        return users;
    }

}

詳情頁面,監聽數據的修改並通知首頁進行同步更新

package com.tb.eventbusdemo.activity;

import android.app.Activity;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.widget.EditText;

import com.tb.eventbusdemo.R;
import com.tb.eventbusdemo.activity.module.User;

import org.greenrobot.eventbus.EventBus;

/**
 * Created by tangbin on 16/6/14.
 */
public class UserInfoDetailActicity extends Activity {
    private EditText et_name;
    private EditText et_sex;
    private EditText et_birthday;
    private EditText et_age;
    private User user;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_userinfo);
        et_name = (EditText) findViewById(R.id.et_name);
        et_sex = (EditText) findViewById(R.id.et_sex);
        et_birthday = (EditText) findViewById(R.id.et_birthday);
        et_age = (EditText) findViewById(R.id.et_age);
        user = (User) getIntent().getSerializableExtra("user");

        if (user != null) {
            et_age.setText(user.getAge());
            et_name.setText(user.getName());
            et_sex.setText(user.getSex());
            et_birthday.setText(user.getBirthday());
        }

        et_age.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count,
                    int after) {

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before,
                    int count) {

            }

            @Override
            public void afterTextChanged(Editable s) {
                user.setAge(s.toString());
                EventBus.getDefault().post(user);
            }
        });

        et_sex.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count,
                    int after) {

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before,
                    int count) {

            }

            @Override
            public void afterTextChanged(Editable s) {
                user.setSex(s.toString());
                EventBus.getDefault().post(user);
            }
        });

        et_birthday.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count,
                    int after) {

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before,
                    int count) {

            }

            @Override
            public void afterTextChanged(Editable s) {
                user.setBirthday(s.toString());
                EventBus.getDefault().post(user);
            }
        });

        et_name.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count,
                    int after) {

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before,
                    int count) {

            }

            @Override
            public void afterTextChanged(Editable s) {
                user.setName(s.toString());
                EventBus.getDefault().post(user);
            }
        });
    }

    @Override
    protected void onResume() {
        super.onResume();
    }
}

源碼地址:

http://download.csdn.net/detail/atangsir/9549801



       

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