EventBus3.0报错..its super classes have no public methods with the @Subscribe annotation

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);
    }
}

需要保证接收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;
            }
        }
    };

子线程发送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();
    }

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();
    }

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);
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值