博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android EventBus初体验
阅读量:5729 次
发布时间:2019-06-18

本文共 4148 字,大约阅读时间需要 13 分钟。

  Android项目中的网络请求回调,大家一般都会使用Handler来进行界面UI的控制。如果在一个Activity中有多个请求,我们所写的Handler方法就会变得十分臃肿,难以阅读。今天在网上看到一个第三方库,能让我们换一种形式来处理这样的需求。也就是EventBus

 

1、EventBus的简单介绍

这么说应该包含4个成分:发布者,订阅者,事件,总线。

那么这四者的关系是什么呢?

很明显:订阅者订阅事件到总线,发送者发布事件。

大体应该是这样的关系:

订阅者可以订阅多个事件,发送者可以发布任何事件,发布者同时也可以是订阅者。

 

2、EventBus的使用方式

 

我们主要需要留意以下的接口方法。

  EventBus.getDefault().register(this);//订阅事件

  EventBus.getDefault().post(object);//发布事件

  EventBus.getDefault().unregister(this);//取消订阅

      //接收订阅

  public void onEventMainThread(object item) {

  }

 

EventBus这个第三方包到底要怎么使用呢,以下我用一个简单的demo展示一下,【点击按钮,完成一个界面的倒数功能】

(1)首先我们需要定义一个Event方法:

package com.dannytest.eventbus_demo;import java.util.List;import com.dannytest.eventbus_demo.bean.Item;public class Event  {      public static class CountEvent    {          private int count;          public CountEvent(int count)          {              this.count = count;          }          public int getCount()          {              return count;          }      }  }

这个是不是有点像get、set的构造方法呢。在我理解上呢,他确实就是这样的,所有的Event就是一个大类,如果我们需要处理某件事(对应这个类中的private属性),

作为发布者,我们利用post将倒数的结果存进(set)这个类当中。然后EventBus就会将这个结果发送到订阅者处(get)。

 

(2)然后我们就可以随意地使用EventBus了(当然eventbus.jar也是必不可少的,网上都能找到)。

package com.dannytest.eventbus_demo;import android.app.Activity;import android.os.Bundle;import android.util.Log;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.TextView;import com.dannytest.testeventbus.R;import com.dannytest.eventbus_demo.Event.CountEvent;import de.greenrobot.event.EventBus;public class MoreCount extends Activity implements OnClickListener{        private TextView tv_count;    private Button btn;        @Override    public void onClick(View v) {        switch (v.getId()) {        case R.id.btn_count:                        System.out.println("----------btnclick");                        new Thread(){                @Override                public void run() {                    super.run();                                        for(int i=50;i>0;i--){                        try {                            //模拟0.5秒倒数一个数                            Thread.sleep(500);                                                        //调用EventBus发布                            EventBus.getDefault().post(new CountEvent(i));                                                      } catch (InterruptedException e) {                            // TODO Auto-generated catch block                            e.printStackTrace();                                                        System.out.println("----------post error"+e.getMessage());                        }                    }                                                                            }            }.start();                        break;        default:            break;        }    }    @Override    protected void onCreate(Bundle savedInstanceState) {        // TODO Auto-generated method stub        super.onCreate(savedInstanceState);                setContentView(R.layout.activity_countmore);        tv_count=(TextView) findViewById(R.id.tv_count);        btn=(Button) findViewById(R.id.btn_count);        btn.setOnClickListener(this);                //订阅事件        EventBus.getDefault().register(this);            }        //这里是--订阅者收到信息后处理--该方法在UI线程中    public void onEventMainThread(CountEvent event) {        tv_count.setText(event.getCount() + "");    }            @Override    protected void onDestroy() {        // TODO Auto-generated method stub        super.onDestroy();                //取消订阅事件        EventBus.getDefault().unregister(this);    }    }

 

   这样,我们就通过EventBus的订阅与发布来实现了原来Handler处理UI界面的功能。

 

(3)EventBus的ThreadMode

 

EventBus包含4个ThreadMode:PostThread,MainThread,BackgroundThread,Async

MainThread我们已经不陌生了;我们已经使用过。

具体的用法,极其简单,方法名为:onEventPostThread, onEventMainThread,onEventBackgroundThread,onEventAsync即可

具体什么区别呢?

onEventMainThread代表这个方法会在UI线程执行

onEventPostThread代表这个方法会在当前发布事件的线程执行

BackgroundThread这个方法,如果在非UI线程发布的事件,则直接执行,和发布在同一个线程中。如果在UI线程发布的事件,则加入后台任务队列,使用线程池一个接一个调用。

Async 加入后台任务队列,使用线程池调用,注意没有BackgroundThread中的一个接一个。

 

 

以上部分内容涉及暴力,哈哈,打错了。

涉及非原创问题,转载出处

转载于:https://www.cnblogs.com/treekang/p/4536185.html

你可能感兴趣的文章
OSChina 周六乱弹 —— 你一口我一口多咬一口是小狗
查看>>
[译]是时候使用Javascript严格模式了
查看>>
Spring--通过注解来配置bean
查看>>
Spring Bean之间的关系
查看>>
pandas 十分钟入门
查看>>
nginx rewrite
查看>>
前端安全系列(一):如何防止XSS攻击?
查看>>
用Mysql5.6出现时间问题Incorrect datetime value: '' for column 'createtime'
查看>>
我的友情链接
查看>>
Pureftpd的权限控制
查看>>
RHEL6 64位ASM方式安装oracle 11gR2(二)
查看>>
微信授权登录
查看>>
IK分词器安装
查看>>
查看Linux并发连接数
查看>>
带有加解密通信的应用安装为windows服务时,需要注意使用的账户
查看>>
发送手机验证码需要注意点问题
查看>>
Android Studio提示"licences have not been accepted"
查看>>
你是谁不重要,关键是你跟谁!
查看>>
CSS中规则@media的用法
查看>>
pychecker:分析你的python代码
查看>>