1. 程式人生 > >EventBus 學習,自動重新整理首頁功能

EventBus 學習,自動重新整理首頁功能

1.EventBus

1.1 EventBus是什麼?

      EventBus由greenrobot組織貢獻(該組織還貢獻了greenDAO),一個Android事件釋出/訂閱輕量級框架,下面來一張圖作為說明。

                                                                                  EventBus說明

1.2 EventBus優勢

  • 我們可以通過解耦釋出者和訂閱者簡化Android事件傳遞。

  • EventBus可以代替Android傳統的Intent、Handler、Broadcast或介面函式,在Fragment,Activity,Service執行緒之間傳遞資料,執行方法,而且程式碼簡單。

  • 快,高效能:特別是在注重效能的Android上。也許在其同類的解決方案是最快的。
  • 小(jar包小於50K),但是強大:EventBus是一個很小的庫,它的API超級簡單。
  • android主執行緒傳遞:當和UI互動的時候,無論這個事件是怎麼提交的,EventBus都可以在主執行緒傳遞事件。

1.3 使用教程

1.3.1 新增依賴

      首先在你的專案中新增eventbus的依賴 

implementation 'org.greenrobot:eventbus:3.1.1'

1.3.2 註冊銷燬EventBus

      接著,在接收Activity的onCreate()方法中註冊EventBus

EventBus.getDefault().register(this);

     其次,在接收Activity的onDestory()中登出EventBus

@Override
    protected void onDestroy() {
        super.onDestroy();
        if(EventBus.getDefault().isRegistered(this)) {
            EventBus.getDefault().unregister(this);
        }
    }

1.3.3 更新UI

值得注意的是,對於接收端更新UI的操作最好在主執行緒

中實現,因為很容易發生崩潰

// 在主執行緒更新UI
    @Subscribe(threadMode = ThreadMode.MAIN)
    public void Event(String string) {
        textView.setText(string);
    }

1.3.4 完整程式碼

        接收端activity程式碼。

public class MainActivity extends AppCompatActivity {

    private Button btnCommon;
    private TextView textView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // 首先要在你要接受EventBus的介面註冊,這一步很重要
        EventBus.getDefault().register(this);
        btnCommon = (Button) findViewById(R.id.btn_common);
        textView = (TextView)findViewById(R.id.tv_content);
        textView.setText("今天是星期五!");
        jumpActivity();
    }

    private void jumpActivity() {
        btnCommon.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(MainActivity.this, CommonActivity.class);
                startActivity(intent);
            }
        });
    }
    
    // 在主執行緒更新UI
    @Subscribe(threadMode = ThreadMode.MAIN)
    public void Event(String string) {
        textView.setText(string);
    }

    // 登出EventBus
    @Override
    protected void onDestroy() {
        super.onDestroy();
        if(EventBus.getDefault().isRegistered(this)) {
            EventBus.getDefault().unregister(this);
        }
    }
}

下面在看傳送端,我們在點選事件中,加入一個EventBus事件,進行傳值。

public class CommonActivity extends AppCompatActivity {
    private Button button;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.second_activity);
        button = (Button) findViewById(R.id.btn2);
        jumpActivity();
    }

    private void jumpActivity() {
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                EventBus.getDefault().post("歡迎大家!");
                finish();
            }
        });
    }
}

1.3.5 效果展示

       第一個介面是接收Activity,第二個介面是傳送Activity,在第二個介面點選“進入跳轉到首頁”按鈕,會用EventBus傳遞需要更新的UI資料,並跳轉到第一個頁面。回到第一個頁面,EventBus接收,完成重新整理UI操作。

重新整理首頁功能

       在實際開發中,我們經常會遇到這種需求:即在某一個模組,完成某一操作後。然後在首頁會進行要求同步顯示,進行UI更新。這要求實現首頁實時重新整理功能。針對這一需求,我考慮採用EventBus去實現。那麼怎麼實現呢,請您繼續閱讀。

2.1 需求分析

由於前端的資料都是請求後臺介面得到的,進而更新展示對應的UI,那麼重新整理流程為:

  1. 在特定頁面完成操作後,可以傳送一個更新指令給首頁
  2. 首頁接收指令後,首頁呼叫上拉,下拉方法
  3. 執行上拉下拉方法的過程中,向後臺對應介面進行請求,更新資料
  4. 更新資料後,改變UI,實現重新整理功能

2.2 實現程式碼

利用EventBus,我們可以在操作頁面向首頁傳送一個引數,告訴首頁進行重新整理操作。主要程式碼邏輯如下:

private void gameFinish() {
    //傳送訊息首頁重新整理狀態
    EventBusBean eventBusBean = new EventBusBean();
    eventBusBean.setCode(EventBusConstant.TASK_REFRESH_CODE);
    EventBus.getDefault().post(eventBusBean);
    try {
      // todo 
      // 邏輯操作
    } 
    catch (Exception e) {
        e.printStackTrace();   
    }
    // todo 關閉頁面操作
  }

          在首頁接收中,我們在在主執行緒中執行重新整理操作,進而實現同步更新內容。

/**
 * 接收傳遞來的資料進行重新整理
 * @param eventBusBean 資料
 */
@Subscribe(threadMode = ThreadMode.MAIN)
public void getOnEvent(EventBusBean eventBusBean) {
    if (eventBusBean.getCode() == EventBusConstant.TASK_REFRESH_CODE) {
        if (checkSubjectBean != null) {
            page = 1;
            mSRefreshLayout.autoRefresh();
        }
    }
}

        值得一說的是,在上面程式碼中 EventBusConstant.TASK_REFRESH_CODE 是我設定的一個完成標誌,這個引數首頁接收到後,就執行重新整理方法,重新進行網路請求,實現重新整理功能。

參考文獻