一、介紹
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