Android異步消息機制和AsyncTask接口的使用

Android異步消息機制和AsyncTask接口的使用。

Android 異步消息機制實現UI處理

1、Android的UI也是線程不安全的,所以必須在主線程更新UI 否則報錯

2、Android的異步消息處理機制

4個部分:Message、Handler、MessageQueue 和Looper

 

流程圖片

①Message:Message可以在攜帶少量信息,用於不同線程之間的消息傳遞

②Handler:消息處理者。發送消息一般使用 Handler的sendMessage()方法,發出的消息經過一系列處理後,最終會傳遞到HandlerdehandleMessahe()方法中。

③MessageQueue: 消息隊列。用於存放Handler發送的消息,這些消息位於消息隊列中,等待被處理。每個線程隻有一個MessageQueue對象

④Looper:MessageQueue的管傢, 調用Looperdeloop()方法後,就會進入無限循環,然後發現每當MessageQueue中存在一條消息,就會將它取出,並傳遞到Handler的handleMessage()方法中。每個線程也隻有一個Looper對象

 

補充:一般會在主線程創建一個繼承瞭Handler的子類的實例, 然後重寫其handleMessage()方法 。 在子線程中就直接用Handler調用sendMessage(Message msg) 就可以瞭

AsyncTask接口的實現()

1、AsyncTask對異步消息處理機制實現瞭進一步封裝, 你可以更簡單的從子線程切換到主線程

2、AsyncTask是抽象類,public abstract classAsyncTask extends Object 。

繼承時,需要指定3個泛型參數。

Params 在執行AsyncTask時需要傳入的參數,用於在後臺任務中使用

Progress 用於顯示當前進度,用泛型指定進度單位

Result 執行結果的返回值類型

 

註意:Params 不能為空 , 我用Android Studio 2.3.3會報錯

3、 需要重寫的常用方法

 

截圖1

 

截圖2

4、小結:在doInBackground()方法中執行具體的耗時任務,在onProgressUpdate()方法中進行UI操作,在onPostExecute()方法中執行一些任務的收尾

代碼實例

 

Mainactivity.java

程序功能:點擊Button 修改textView + 一個虛擬的下載任務(註釋部分)

 

package com.lfork.a98620.androidthreadtest;

import android.os.AsyncTask;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;



public class MainActivity extends AppCompatActivity {

    publicstatic final int UPDATE_TEXT= 1;
    privateTextView text;

    //Android異步消息機制實現UI處理   runOnUiThread()方法就是一個封裝好的例子
    private Handler handler = newHandler(){
        @Override
        publicvoid handleMessage(Message msg) {
            switch(msg.what) {
                case UPDATE_TEXT:
                    //進行UI操作
                    String str = "nice to meetyou";
                    text.setText(str);
                    break;
                default:
                    break;
            }

        }
    };

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

        Button change = (Button)findViewById(R.id.btn_nice);
        text= (TextView) findViewById(R.id.hello);

        change.setOnClickListener(new View.OnClickListener() {
            @Override
            publicvoid onClick(View view) {
                new Thread(newRunnable() {
                    @Override
                    publicvoid run() {
//                       String str = "nice to meet you";
//                       text.setText(str);

                        Message message = newMessage();
                        message.what =UPDATE_TEXT;
                        handler.sendMessage(message);
                    }
                }).start();
            }
        });
    }
}


//啟動任務的時候就執行  new DownloadTask().execute()即可  虛構的任務

//class DownloadTask extends AsyncTask {
//
//
//    @Override
//    protected void onPreExecute() {
//       // progressDialog.show();
//        // 顯示進度對話框
//    }
//
//
//    @Override
//    protected BooleandoInBackground(Integer... integers) {
//
//        try {
//            while (true) {
//                int downloadPercent = doDownload();//虛構的方法
//               publishProgress(downloadPercent);
//
//                if (downloadPercent>= 100) {
//                    break;
//                }
//            }
//        } catch (Exception e) {
//            return false;
//        }
//
//        return null;
//    }
//
//    @Override
//    protected voidonProgressUpdate(Integer... values) {
//        //在這裡更新下載進度
//       progressDialog.setMessage("Downloaded" + values[0] +"%");
//    }
//
//    @Override
//    protected voidonPostExecute(Boolean result) {
//        progressDialog.dismiss();//關閉進度對話框
//        //在這裡提示下載結果
//        if (result) {
//            Toast.makeText(context,"Download succeeded", Toast.LENGTH_SHORT).show();
//        } else {
//            Toast.makeText(context,"Download failed", Toast.LENGTH_SHORT).show();
//        }
//
//    }
//}

 

佈局文件

 


 

 

You May Also Like