各位看官们大家好,上一回中咱们说的是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机制的例子咱们就介绍到这里,欲知后面还有什么例子,且听下回分解!