Android中EventBus详解
2016-06-17 17:38
429 查看
一、介绍
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渲染
详情页面,监听数据的修改并通知首页进行同步更新
源码地址:
http://download.csdn.net/detail/atangsir/9549801
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
相关文章推荐
- Android四大组件之Service详解
- Android 引用外部项目库笔记
- Android 短信的还原
- Android 创建Library Project(库项目)与引用操作
- 签名Android应用程序
- Android 自定义View——分类与流程
- android 百度地图遇到疑难问题解决方案
- android 实现水波纹效果(二) 优化篇
- android onNewIntent()
- 自定义Android商品标签控件
- 【Android】viewbadger实现未读消息红点提醒,并显示条数
- Android @SuppressLint("NewApi")和@TargetApi()的区别
- Android开发之RecyclerView的使用全解
- android 在命令行中查看SQLite数据库数据
- android Window Leaked异常的解决方法
- GoogleApi与Android SDK区别
- Android之EditText输入框限制表情的输入
- Android Studio使用技巧
- Android Studio里debug.store的SHA1获取方法
- Android静默安装实现方案