题记:搞了半年的所谓J2EE开发,现在重新加入Droid的前端开发。很多东西都忘记了,现在一个个复习起上来。第一个当然要复习AsyncTask的用法。
AsyncTask主要方法的梳理:
执行次序 | 执行时机 | 方法名称 | 调用方 |
1 | 异步任务执行前 | onPreExecute | UI线程 |
2 | 异步任务执行中 | doInBackground | 后台线程 |
3 | 异步任务执行中 | publishProgress | 后台线程 |
4 | 异步任务执行中 | onProgressUpdate | UI线程 |
5 | 异步任务执行后 | onPostExecute | UI线程 |
UI线程(MainActivity.java):
启动AsyncTask。
package com.example.asynctaskexample;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.ProgressBar;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ProgressBar myProgressBar=(ProgressBar)findViewById(R.id.progress_horizontal);
/**
* 启动异步任务,并传入"Begin","End"值演示UI线程向后端线程传值的情况
*/
new MyAsyncTask(myProgressBar, getApplicationContext()).execute("Begin","End");
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
后端线程( MyAsyncTask.java ):
定义异步线程的处理逻辑
package com.example.asynctaskexample;
import android.content.Context;
import android.os.AsyncTask;
import android.os.Debug;
import android.util.Log;
import android.widget.ProgressBar;
import android.widget.Toast;
/**
* AsyncTask<Params, Progress, Result>
*
* Params定义传入异步任务的参数类型。如本例就是,String
* 传入异步任务的参数,由UI线程调用execute()方法传入,由后台线程调用doInBackground()方法获取
*
* Progress定义异步任务执行过程中UI线程与后台线程之间传递的参数的类型。如本例就是,Integer
* 后台线程调用publishProgress()方法并传入参数,UI线程调用onProgressUpdate()方法并获取参数值
*
* Result定义异步任务执行结束后,后台线程向UI线程反馈执行结果时传递的参数类型。如本例就是,String
* 后台线程执行doInBackground()方法结束后,通过返回值向UI线程反馈执行结果,UI线程调用onPostExecute()方法
* 并通过参数获取反馈结果
*/
public class MyAsyncTask extends AsyncTask<String, Integer, String> {
/**
* 各常用方法使用时机:
*
* 执行次序 执行时机 方法名称 调用方
*1 异步任务执行前 onPreExecute UI线程
*2 异步任务执行中 doInBackground 后台线程
*3 异步任务执行中 publishProgress 后台线程
*4 异步任务执行中 onProgressUpdate UI线程
*5 异步任务执行后 onPostExecute UI线程
*
*/
/**
* MainActivity的进度条
*/
ProgressBar myprogressbar=null;
/**
* MainActivity的上下文
*/
Context mycontext=null;
public MyAsyncTask(ProgressBar progressbar,Context context) {
// TODO Auto-generated constructor stub
myprogressbar=progressbar;
mycontext=context;
}
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();
myprogressbar.setProgress(0);
Toast.makeText(mycontext,"进度条开始加载...",Toast.LENGTH_SHORT).show();
}
@Override
protected String doInBackground(String... params) {
// TODO Auto-generated method stub
String ret=null;
/**
* 通过Begin,End演示多参数传值
*/
String Begin=params[0];
String End=params[1];
Log.d("Kaiwii_Test", Begin);
/**
* 模拟耗时步骤
*/
for(int i=0;i<10;i++){
/**
* 后台线程向UI线程发布进度状态i
*/
publishProgress(i);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
Log.d("Kaiwii_Test", End);
ret="更新完毕……";
return ret;
}
/**
* UI线程通过参数result获得后端线程执行doInBackground()后的返回值
*/
@Override
protected void onPostExecute(String result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
Toast.makeText(mycontext,result,Toast.LENGTH_SHORT).show();
//myprogressbar.setProgress(myprogressbar.getMax());
}
@Override
/**
* UI线程从后端线程获取状态值values,并且 UI线程根据状态值values
* 更新进度条状态
*/
protected void onProgressUpdate(Integer... values) {
// TODO Auto-generated method stub
super.onProgressUpdate(values);
int progress=myprogressbar.getMax()/10*(values[0]+1);
Log.d("Kaiwii_Test", "Progress"+progress);
myprogressbar.setProgress(progress);
}
}