Android EventBus初体验

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

 

一、EventBus的简单介绍android

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

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

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

大致应该是这样的关系:post

订阅者能够订阅多个事件,发送者能够发布任何事件,发布者同时也能够是订阅者。this

 

二、EventBus的使用方式spa

 

咱们主要须要留意如下的接口方法。.net

  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中的一个接一个。

 

 

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

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

http://blog.csdn.net/lmj623565791/article/details/40794879