赞
踩
EventBus也用了好久了,今天没事想做个分享的demo,万万妹想到啊,刚集成就出了个问题
报错如下
Caused by: org.greenrobot.eventbus.EventBusException: Subscriber class com.example.legend.eventbusdemo.MainActivity and its super classes have no public methods with the @Subscribe annotation
at org.greenrobot.eventbus.SubscriberMethodFinder.findSubscriberMethods(SubscriberMethodFinder.java:67)
at org.greenrobot.eventbus.EventBus.register(EventBus.java:136)
at com.example.legend.eventbusdemo.MainActivity.onCreate(MainActivity.java:23)
at android.app.Activity.performCreate(Activity.java:6910)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1123)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2746)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2864)
at android.app.ActivityThread.-wrap12(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1567)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:156)
at android.app.ActivityThread.main(ActivityThread.java:6524)
at java.lang.reflect.Method.invoke(Native Method)
代码如下:
public class MainActivity extends AppCompatActivity {
private TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//
EventBus.getDefault().register(this);
tv = (TextView) findViewById(R.id.tv);
Button bt = (Button) findViewById(R.id.bt);
bt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
startActivity(new Intent(MainActivity.this,SecondActivity.class));
}
});
}
/**
* 事件接收必须是public
* 否则报异常:its super classes have no public methods with the @Subscribe annotation
* @param event
*/
@Subscribe(threadMode = ThreadMode.MAIN)
public void getMsgEvent(HelloEvent event){
tv.setText(event.getMsg());
}
@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
}
}
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
需要保证接收Event事件的方法是public
——————————咯咯咯 咯咯咯掉小jj——————————–
这里在回顾一下Handle消息机制
为什么会有Handler消息机制?
因为Android应用只有一个主线程,如果把一些耗时的操作放在主线程,比如下载,那么因为长时间的等待会出现ANR异常并且对用户来讲是非常不爽的,这样就导致主线程也就是UI县城被阻塞,为了避免这个问题,一些耗时的操作就需要放在子线程去处理,而在子线程处理完事情之后我们可能需要做一些通知主线程去更新UI的操作,于是乎,Android就需要一种线程之间消息传递机制去解决这个问题,那就是Handler消息机制。
Handler机制的几个重要角色
Message:消息,消息里面可以包含消息Id,消息对象,以及处理的数据等
MeaaageQueue:消息列队,用来存放Handler发送过来的Message,按照先进先出的原则排列消息,注意他不是真正的存储Message,而是将Message以链表的方式串联,登录Looper的抽取
Looper:消息轮询器,不断的从MessageQueue中查询是否有新的消息进入消息队列,如果有,交给Handler处理。
Handler:消息处理者,负责消息的发送及处理。需要实现handlerMessage(Message msg)方法来处理Message
Handler的使用
1发送消息,在不同的线程之间发送消息
sendEmptyMessage(int);//发送一个空的消息
sendMessage(Message);//发送消息,消息中可以携带参数
sendMessageAtTime(Message, long);//未来某一时间点发送消息
sendMessageDelayed(Message, long);//延时Nms发送消息
如主线程定义Handler
Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case 0:
//完成主界面更新,拿到数据
String data = (String) msg.obj;
textView.setText(data);
break;
default:
break;
}
}
};
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
子线程发送Message,更新UI
private void getDataFromNet() {
new Thread(new Runnable() {
@Override
public void run() {
//耗时操作,完成之后发送消息给Handler,完成UI更新;
mHandler.sendEmptyMessage(0);
//需要数据传递,用下面方法;
Message msg = new Message();
msg.obj = "网络数据";//可以是基本类型,可以是对象,可以是List、map等;
mHandler.sendMessage(msg);
}
}).start();
}
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
2计划任务
post(Runnable);//提交计划任务马上执行
postAtTime(Runnable, long);//提交计划任务在未来的时间点执行
postDelayed(Runnable, long);//提交计划任务延时Nms执行
如主线程创建Handler
private Handler mHandler=new Handler();
子线程提交任务更新UI
private void getDataFromNet() {
new Thread(new Runnable() {
@Override
public void run() {
//耗时操作,完成之后提交任务更新UI
final String data = "网络数据";
mHandler.post(new Runnable() {
@Override
public void run() {
textView.setText(data);
}
});
}
}).start();
}
Handler机制扩展
Android在Handler的基础上有提供了几种消息传递的方式
1Activity.runOnUiThread(Runnable)
private void getDataFromNet() {
new Thread(new Runnable() {
@Override
public void run() {
//耗时操作,完成之后提交任务更新UI
final String data = "网络数据";
runOnUiThread(new Runnable() {
@Override
public void run() {
textView.setText(data);
}
});
}
}).start();
}
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
2View.post(Runnable)
private void getDataFromNet() {
new Thread(new Runnable() {
@Override
public void run() {
//耗时操作,完成之后提交任务更新UI
final String data = "网络数据";
textView.post(new Runnable() {
@Override
public void run() {
textView.setText(data);
}
});
}
}).start();
}
3AsyncTask
private void getDataFromNet() {
MyTask task = new MyTask();
task.execute();
}
private class MyTask extends AsyncTask {
//后台线程执行时
@Override
protected Object doInBackground(Object... params) {
耗时操作,
String data = "网络数据";
return data;
}
//后台线程执行结束后的操作,其中参数result为doInBackground返回的结果
@Override
protected void onPostExecute(Object result) {
super.onPostExecute(result);
textView.setText((String) result);
}
}
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。