zoukankan      html  css  js  c++  java
  • EventBus使用详解

    EventBus是针一款对Android的发布/订阅事件总线。它可以让我们很轻松的实现在Android各个组件之间传递消息,并且代码的可读性更好,耦合度更低。长话短说直接介绍使用。

    如何使用 (以下介绍一下 活动和intentService之间的通信)

    (1)首先需要定义一个消息类,该类可以不继承任何基类也不需要实现任何接口。我是单独建一个文件存放这个类 如:

    public class MessageEvent {
    
        private String message;
    
        public MessageEvent(String message) {
            this.message = message;
        }
    
        public String getMessage() {
            return message;
        }
    
        public void setMessage(String message) {
            this.message = message;
        }
    }

    (2)在需要订阅事件的地方注册事件

        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            //注册事件
            EventBus.getDefault().register(this);  //这里是注册事件  请注意这里
    
    
            Button startService = (Button) findViewById(R.id.startIntentService);
            startService.setOnClickListener(this);
    
            SpeechUtility. createUtility(this, SpeechConstant. APPID + "=5b02688c" );
    
            handler=new Handler();
            handler.postDelayed(runnable, 1000);//每1秒执行一次runnable.
    
    //        startMyService(getApplicationContext());
    
        }

    (3)产生事件,即发送消息 (在 intentService 里面需要发送数据的地方 发送消息)

     EventBus.getDefault().post(new MessageEvent("problem:"+textString));

    (4)处理消息  (在activity 里面接收消息 并且处理 我只是显示出来了)

    
    
    @Subscribe(threadMode = ThreadMode.MainThread)
    public void onMessageEventMainThread(MessageEvent messageEvent) {
        Log.i("MainThread", messageEvent.getMessage());
        Toast.makeText(this,  messageEvent.getMessage(), Toast.LENGTH_SHORT).show();
    
    }
    
    

    (5)取消消息订阅(在活动结束的时候 取消消息订阅)

        @Override
        protected void onDestroy() {
            super.onDestroy();
            //取消事件注册
            EventBus.getDefault().unregister(this);
    
        }

    线程模型

    在EventBus的事件处理函数中需要指定线程模型,即指定事件处理函数运行所在的想线程。在上面我们已经接触到了EventBus的四种线程模型。那他们有什么区别呢?
    在EventBus中的观察者通常有四种线程模型,分别是PostThread(默认)、MainThread、BackgroundThread与Async。

    • PostThread:如果使用事件处理函数指定了线程模型为PostThread,那么该事件在哪个线程发布出来的,事件处理函数就会在这个线程中运行,也就是说发布事件和接收事件在同一个线程。在线程模型为PostThread的事件处理函数中尽量避免执行耗时操作,因为它会阻塞事件的传递,甚至有可能会引起ANR。
    • MainThread:如果使用事件处理函数指定了线程模型为MainThread,那么不论事件是在哪个线程中发布出来的,该事件处理函数都会在UI线程中执行。该方法可以用来更新UI,但是不能处理耗时操作。
    • BackgroundThread:如果使用事件处理函数指定了线程模型为BackgroundThread,那么如果事件是在UI线程中发布出来的,那么该事件处理函数就会在新的线程中运行,如果事件本来就是子线程中发布出来的,那么该事件处理函数直接在发布事件的线程中执行。在此事件处理函数中禁止进行UI更新操作。
    • Async:如果使用事件处理函数指定了线程模型为Async,那么无论事件在哪个线程发布,该事件处理函数都会在新建的子线程中执行。同样,此事件处理函数中禁止进行UI更新操作。
     
  • 相关阅读:
    记事本+hhc生成CHM
    在Delphi里实现[int map string]对
    U盘插入拔出提示
    Delphi研发笔试试卷 我的小解
    Excel也能用SQL查询
    访问JAVA中的字段(jfieldID)
    调用JAVA方法
    缓存字段ID和方法ID
    JNI引用
    访问数组(JNI)
  • 原文地址:https://www.cnblogs.com/wanghuixi/p/9128539.html
Copyright © 2011-2022 走看看