天天看點

android 多線程

AsyncTask類在子線程對UI進行操作

繼承AsyncTask類時指定三個參數:<Params, Progress, Result>

Params 傳入的泛型參數

Progress 整形

Result 回報結果

class RecyclerViewTask extends AsyncTask<Void, Integer, String> {

//背景任務開始執行前調用,用于界面的初始化操作

onPreExecunte(){}

//這個方法的代碼會在子線程中運作,在這裡處理耗時任務。任務完成後,通過return語句傳回結果。這個方法不能進行UI操作

doInBackground(){}

//

}

使用AsyncTask

package com.test.admin.test;

import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

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

    public void onClick(View view){
        new pro().execute();
    }
    //
    class pro extends AsyncTask<Void,Integer,Boolean>{

        ProgressDialog progressDialog=new ProgressDialog(MainActivity.this);
        //在背景任務開始執行前調用,用于進行一些界面的初始化,如顯示進度條對話框等
        @Override
        protected void onPreExecute() {

            progressDialog.setTitle("正在更新");
            progressDialog.setMessage("loading");
            //是否能用回退鍵取消界面
            progressDialog.setCancelable(true);
            progressDialog.show();
        }
        //裡面所有的代碼都會在子線程執行,處理所有的耗時任務,完後成通過retrun傳回執行結果。
        //如果AsyncTask第三個參數是void,則不可傳回結果。
        //這個方法不能進行UI操作,如需要更新UI元素,目前任務進度,可調用publishProgress(Progress...)完成
        @Override
        protected Boolean doInBackground(Void... params) {
            for(int i=1;i<=100;i++){
                try {
                    //延遲
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                publishProgress(i);
                if (i==100){
                    break;
                }
            }
            return true;
        }
        //在背景任務中調用了publishProgress(Progress...)方法後會調用該方法,在此方法中進行UI操作。
        @Override
        protected void onProgressUpdate(Integer... values) {
            progressDialog.setMessage("Downloaded"+values[0]+"%");
        }
        //當背景任務執行完畢并通過retrun語句進行傳回時,這個方法會被調用傳回的資料作為參數傳到此方法。
        // 可利用該參數進行UI操作,如提醒任務執行結果,關閉進度條等
        @Override
        protected void onPostExecute(Boolean aBoolean) {
           if (aBoolean){
               progressDialog.dismiss();
               Toast.makeText(MainActivity.this,"下載下傳成功",Toast.LENGTH_SHORT).show();
           }
        }
    }
}      

 運作結果

android 多線程

水準進度條的顯示

在onPreExecute方法裡添加

// 設定水準進度條
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
// 設定提示的title的圖示,預設是沒有的
//progressDialog.setIcon(R.mipmap.ic_launcher);
//設計進度條最大值,預設100
//progressDialog.setMax(1000);      
//更新進度條進度,1是1倍增量
progressDialog.incrementProgressBy(1);
//二級進度條更新方式
//progressDialog.incrementSecondaryProgressBy(2);