一起Talk Android吧(第一百八十五回:Android的中AsyncTask机制四)

各位看官们大家好,上一回中咱们说的是Android中AsyncTask机制的例子,这一回咱们继续说该例子。闲话休提,言归正转。让我们一起Talk Android吧!

看官们,我们在上一章回中介绍了代码的具体操作,并且给出了布局文件的代码,这一回中我们将给出逻辑操作的代码,代码是主要包含自定义AsyncTask子类以及重写它的回调方法,剩下的代码主要是Activity中的生命周期方法和ProgressBar的更新过程,下面是具体的代码,请大家参考:

package com.example.talk8.blogapp05_handler;

import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Button;
import android.widget.ProgressBar;
import android.util.Log;

public class ActivityAsyncEx extends AppCompatActivity {

    public AsyncTaskEx mAsyncTask;
    public static ProgressBar mProecssBar;
    public Button mBTShowProcess;
    public String mProcessLength = String.valueOf(50);
    private static final String TAG = "AsyncEx";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_async_ex);
        Log.i(TAG, "onCreate:  start Asnyc Task Thread: 
        "+Thread.currentThread().toString());

        //获取进度条控件以及它的最大进度值
        mProecssBar = (ProgressBar)findViewById(R.id.id_process_bar);
        //获取按钮控件,用来控制是否在进度中显示进度
        mBTShowProcess = (Button) findViewById(R.id.id_bt_show_process);

        //创建自定义的AsyncTask对象
        mAsyncTask = new AsyncTaskEx();
        Log.i(TAG, "onCreate: before start Asnyc Task States = "+mAsyncTask.getStatus());
        //在主线程中启动子线程
        mBTShowProcess.setOnClickListener(v -> mAsyncTask.execute(mProcessLength));
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.i(TAG, "onResume:  Status = "+mAsyncTask.getStatus());
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.i(TAG, "onPause: status = "+mAsyncTask.getStatus());
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();

        if(mAsyncTask.isCancelled()) {
            Log.i(TAG, "onDestroy:  task is canceled");
        }else {
            Log.i(TAG, "onDestroy:  task is  not canceled");
            Log.i(TAG, "onDestroy:  task state: "+mAsyncTask.getStatus());
            mAsyncTask.cancel(true);
            mAsyncTask = null;
        }
    }

    //更新进度条
    public void updateProcess(int value) {
        //如果不在定义时赋值,那么它会出现null的情况
        if(mProcessLength == null){
            Log.i(TAG, "updateProcess:  return");
            return;
        }
        if(value>=0 && value <= Integer.parseInt(mProcessLength)) {
            mProecssBar.setProgress(value+1);
        }
    }
}

//自定义AsyncTask的子类,指定3个参数的泛型类型,并且重写4个回调方法
 class AsyncTaskEx extends AsyncTask<String, Integer,Boolean> {
    private static final String TAG = "AsyncEx";
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        Log.d(TAG, "onPreExecute: Statue = "+this.getStatus()+
        " Thread: "+Thread.currentThread().toString());
    }

    @Override
    protected void onPostExecute(Boolean aBoolean) {
        super.onPostExecute(aBoolean);
        Log.d(TAG, "onPostExecute: res = "+aBoolean+ " status = "+this.getStatus()
        +" Thread: "+Thread.currentThread().toString());
    }

    @Override
    protected void onProgressUpdate(Integer... values) {
        super.onProgressUpdate(values);
        int process = 0;
        if(values != null && values.length > 0) {
            process = values[0].intValue();
        }
        Log.d(TAG, "onProgressUpdate:  Thread: "+Thread.currentThread().toString());
        new ActivityAsyncEx().updateProcess(process);
        Log.d(TAG, "onProgressUpdate:  process = "+values[0].intValue()+
         " status = "+this.getStatus());
    }

    @Override
    protected void onCancelled(Boolean aBoolean) {
        super.onCancelled(aBoolean);
        Log.d(TAG, "onCancelled: param =  "+aBoolean);
    }

    @Override
    protected void onCancelled() {
        super.onCancelled();
        Log.d(TAG, "onCancelled: ");
    }

    @Override
    protected Boolean doInBackground(String... strings) {
        int length = 0;
        Log.d(TAG, "doInBackground:  status = "+
        this.getStatus()+ " Thread: "+Thread.currentThread().toString());

        if(strings != null && strings.length > 0) {
            length = Integer.valueOf(strings[0]);
        }
        for (int i=0; i<length;++i){
            publishProgress(new Integer(i));
            try {
                Thread.sleep(10);
            }catch (Exception e) {
                e.printStackTrace();
            }
        }
        return true;
    }
}

看官们,在代码的关键地方都添加了注释,请大家结合前面章回中介绍的操作步骤来阅读代码,下面是程序的运行结果,请大家参考:
在这里插入图片描述

各位看官,关于Android中AsnycTask机制的例子咱们就介绍到这里,欲知后面还有什么例子,且听下回分解!

发布了538 篇原创文章 · 获赞 132 · 访问量 63万+

猜你喜欢

转载自blog.csdn.net/talk_8/article/details/105621665