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 AsyncTask
subclases 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 ProgressBar
proceso 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:
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!