EventBusの小さなDemo

8926 ワード

前言
前に観察者モードについて話しましたが、EventBusについてお話しします.私もここ数日EventBusのソースコードを見ています.全体の流れはもう見ました.EventBusの長所も発見しましたが、まだ細かい点がはっきりしていません.今は言語で表現する方法が分からない段階なので、EventBusのソースコード解析は少し遅れています.とてもsorryです.
だからまず簡単にdemoを書いて、最後にこのdemoの基礎の上で、まず簡単にEventBusのいくつかの機能に対する性能の最適化を話します.
本文
まず、JavaのObserableとObseverを使うのか、それとも私たち自身が観察者と被観察者を定義するのかを考えてみましょう.
私はこう思っています.
1、ObserableとObseverは意味的に少し悪いと思います.RxJavaなどのオープンソースライブラリとは、クラスのネーミングが重複していて、混同しやすいです.
2、Obserableを使用する場合、各定義の観察者は内部の小さな詳細、すなわち新しい定義クラスを実現しなければならないが、Stringまたはintによって管理をより容易に区別することが多い.
だから私はやはり自分で全体の流れを実現するのが便利だと思って、それではくだらないことを言わないで、コードは歩きます:
コールバック関数を定義してから、このインタフェースを実装します.
/**
 * Created by li.zhipeng on 2017/8/4.
 *
 *      EventBus       
 */

public interface EventListener {

    void onEvent(int eventCode, Object object);
}

観察者の再定義:
/**
 * Created by li.zhipeng on 2017/8/4.
 * 

* EventBus , */

public class EventBus { /** * */ private static EventBus instance; private EventBus() { } public synchronized static EventBus getInstance() { if (instance == null) { instance = new EventBus(); } return instance; } /** * , *

* int , , SparseArray *

* , HashSet, */

private SparseArray> observables = new SparseArray<>(); /** * *

* , , , */

public synchronized void registerEvent(int eventCode, EventListener listener) { // HashSet observers = observables.get(eventCode); // , , if (observers == null) { observers = new HashSet<>(); observables.put(eventCode, observers); } // observers.add(listener); } /** * *

* , , , */

public synchronized void unregisterEvent(int eventCode, EventListener listener) { // HashSet observers = observables.get(eventCode); // if (observers != null) { observers.remove(listener); } } /** * , *

* Observable */

public void sendEvent(int eventCode, Object object) { // Set EventListener[] arrLocal; // , , synchronized (this) { arrLocal = toArray(observables.get(eventCode)); } // for (int i = arrLocal.length - 1; i >= 0; i--) { arrLocal[i].onEvent(eventCode, object); } } /** * HashSet * */ private EventListener[] toArray(HashSet set){ EventListener[] r = new EventListener[set.size()]; Iterator it = set.iterator(); for (int i = 0; i < r.length; i++) { r[i] = it.next(); } return r; } /** * * */ public void clear(){ observables.clear(); } }

我々はすべての被観察者と対応する観察者をキー値ペアとしてMapに保存することで,容易に取得して保存し,その後,登録して観察者を追加または除去し,実際には対応する観察者を遍歴する操作であることを通知する.
使用しても以前とあまり違いはありません.
public class MainActivity extends AppCompatActivity implements EventListener{

    private TextView textView;

    private int count;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        textView = (TextView) findViewById(R.id.textView);
    //              
        findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                EventBus.getInstance().sendEvent(1, "test" + count++);
            }
        });
         //   
        EventBus.getInstance().registerEvent(1, this);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //   
        EventBus.getInstance().unregisterEvent(1, this);
    }

    //        
    @Override
    public void onEvent(int eventCode, Object object) {
        textView.setText((String) object);
    }
}

EventBusの最適化
実装の中心思想には違いはありませんが、性能上、間違いなく粗いです.例えば、すべての操作がメインスレッドにあるため、同時性と時間の消費に潜在的な問題があります.EventBusはどのようにこれらの問題を最適化していますか.
1、キュー管理を増やし、非同期通知方式を増やし、メインスレッドの圧力を軽減した.2、キュー管理に基づき、タスクキャンセルのメカニズムを追加し、重複タスクの実行を防止する.3、キャッシュメカニズムを追加し、通知のたびに無意味なオブジェクトを作成することを防止し、メモリのオーバーヘッドを低減する.4、コールバック関数の実行を増やし、メインスレッドかサブスレッドか、注釈で使用できます.
まとめ
EventBusにはいくつかの非常に良い特徴があります.私はまだ発見していないかもしれませんが、彼が使っている多くの開発者から歓迎されている程度から、まず彼が安定して信頼性があり、効率もいいことを説明します.私が彼のソースコードをよく研究してから、詳しく紹介します.