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

相關文章
相關標籤/搜索