1. 程式人生 > >Android中使用非同步執行緒更新UI檢視的幾種方法

Android中使用非同步執行緒更新UI檢視的幾種方法

在Android中子執行緒是不能更新ui的。

所以我們要通過其他方式來動態改變ui檢視,

1、runOnUiThread
activity提供的一個輕量級更新ui的方法,在Fragment需要使用的時候要用getActivity.runOnUiThread開啟執行緒
這種方法最簡單,方便更新一些不需要判斷的通知,比如在聊天專案中動態獲取未讀訊息數量。

runOnUiThread(new Runnable() {
            @Override
            public void run() {
                    sendMessage(
"[自動回覆]你好,我是機器人"); } });

2、Handler message

使用這個方法可以設定比如按鈕倒計時的控制,也是比較常見的一種更新ui的方法。

建立一個主執行緒用於接收子執行緒不斷髮送的訊息,通過msg.what判斷傳遞的訊息型別。 
根據型別進行相關ui的更新操作。

建立執行緒用於接收:

 private Handler mHandler = new Handler() {
        public void handleMessage(Message msg) {
            
switch (msg.what) { case 0: setResult(RESULT_OK); TimerButtonActivity.this.finish(); break; case 4: mTimer1.setEnabled(false); mTimer1.setText("已傳送(" + String.valueOf(time) + "
)"); break; case 5: mTimer1.setEnabled(true); mTimer1.setText("重新獲取驗證碼"); time = 10; break; } } };

傳送訊息的方法:

mHandler.sendEmptyMessage(5);

3、Handler Runnable

同樣也是需要先建立一個執行緒。

 Handler handler = new Handler();

在一開始載入的地方使用postDelayed設定載入延遲

 handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                updataData();
            }
        }, 2000);

或者我們要進行一個自動重新整理的動作,當動作完成時,隱藏重新整理效果

//開啟一個重新整理的執行緒
        mFragmentMainRf.post(new Runnable() {
            @Override
            public void run() {
                //開始
                mFragmentMainRf.setRefreshing(true);
            }
        });
        //監聽重新整理狀態操作
        mFragmentMainRf.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                //設定延遲重新整理時間1500
                handler.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        //重新整理資料
                        updataData();
                    }
                }, 1800);
            }
        });

4、AsyncTask
AsyncTask可以更加輕鬆地使用UI執行緒。該類允許執行後臺操作並在UI執行緒上更新檢視,而不需要操縱執行緒和處理程式。
AsyncTask被設計為一個輔助類Thread,Handler 並且不構成通用執行緒框架。用於短時間更新操作。
在使用的時候需要繼承AsyncTask並重寫方法:
doInBackground:用於返回結果
onProgressUpdate: onProgressUpdate是在UI執行緒中執行,所有可以對UI空間進行操作
onPostExecute:接收doInBackground的返回結果,用於更新UI

  class AsyncTaskWrapper extends AsyncTask<Void, Integer, Object>{

        @Override
        protected Object doInBackground(Void... voids) {
            try {
                Thread.sleep(2000);
                  } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onProgressUpdate(Integer... values) {
            super.onProgressUpdate(values);
            Log.e("Progress",valuse);
        }

        @Override
        protected void onPostExecute(Object o) {
            super.onPostExecute(o);
            Log.e("Message",o);
        }
    }