1. 程式人生 > >Android中使用異步線程更新UI視圖的幾種方法

Android中使用異步線程更新UI視圖的幾種方法

his exec 計時 創建線程 break vat set 重寫 fin

在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);
        }
    }

Android中使用異步線程更新UI視圖的幾種方法