Hablemos juntos de Android (la 185ª ronda: mecanismo 4 de AsyncTask de Android)

Hola a todos. La última vez hablamos de un ejemplo del mecanismo AsyncTask en Android. Esta vez seguimos hablando de este ejemplo. Cotilleando al respecto, acertándolo. ¡Hablemos de Android juntos!

Inspectores, introdujimos la operación específica del código en la parte posterior del capítulo anterior y le dimos el código del archivo de diseño. En esta ronda, daremos el código de la operación lógica. El código contiene principalmente AsyncTasksubclases personalizadas y pesadas Escriba su método de devolución de llamada, el código restante es principalmente el método del ciclo de vida y el ProgressBarproceso de actualización en Actividad , el siguiente es el código específico, consulte:

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

Inspectores, se han agregado comentarios a las partes clave del código. Lea el código junto con los pasos descritos en el capítulo anterior. El siguiente es el resultado del programa. Consulte:
Inserte la descripción de la imagen aquí

Verá, presentaremos el ejemplo del mecanismo AsnycTask en Android aquí, si desea saber qué ejemplos están detrás, ¡y escuche la próxima descomposición!

538 artículos originales publicados · Me gustaron 132 · Visitantes 630,000+

Supongo que te gusta

Origin blog.csdn.net/talk_8/article/details/105621665
Recomendado
Clasificación