AsyncTask
目的:方便后台线程中操作后更新UI
实现:Thread和Handler进行了封装
实质:Handler异步消息处理机制
泛型参数:Params:doInBackground方法的参数类型;Progress:AsyncTask所执行的后台任务的进度类型;Result:后台任务的返回结果类型
UI操作:onPreExecute() //此方法会在后台任务执行前被调用,用于进行一些准备工作
onPostExecute(Result result) //后台任务执行完毕后,此方法会被调用,参数即为后台任务的返回结果
后台线程操作:doInBackground(Params… params) //此方法中定义要执行的后台任务
输入输出:Params,Result
进度显示:onProgressUpdate(Progress… values) //由publishProgress内部调用,表示任务进度更新
除了doInBackground方法由AsyncTask内部线程池执行外,其余方法均在主线程中执行
一个应用实例——屏幕补光测试
实现老化测试屏幕补光测试项,部分真实代码
private static final String TAG = "RetinaFlashTestActivity";
public static final int WHITE_FRAMELAYOUT_INVISIABLE_CODE = 0; //隐藏白屏标记码
public static final int WHITE_FRAMELAYOUT_VISIABLE_CODE = 1; //显示白屏标记码
public static final long RETINA_FLASH_TIME = 1200; //补光时间
public static final long RETINA_FLASH_INERVAL_TIME = 3000; //间隔时间
private RetinaFlashTask retinaFlashTask; //屏幕补光测试AsyncTask异步任务
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.retina_flash);
Log.d(TAG, "onCreate: true");
UtilLog.d(TAG, "--------进入补光测试项");
initTime(); //初始化测试时间和进入时间
setActionBar(); //设置ActionBar无图标
initView(); //初始化布局文件
retinaFlashTask = new RetinaFlashTask(); //实例异步任务对象
retinaFlashTask.execute(testTime); //开始执行AsyncTask异步任务,传入测试时间参数
}
class RetinaFlashTask extends AsyncTask<Long, Integer, Boolean> {
@Override
protected void onPreExecute() { //AsyncTask异步任务开始前执行的操作,UI线程中
Log.d(TAG, "onPreExecute: true");
UtilLog.d(TAG, "--------补光测试异步任务开始前操作");
super.onPreExecute();
if (factory_mode) { //初始化结果报告内容
str_report_prop = "f_str_" + getItemPropById(TEST_RETINAFLASH) + "_report"; //执行结果
str_count_prop = getItemPropById(TEST_RETINAFLASH) + "_f_count"; //执行次数
} else {
str_report_prop = "str_" + getItemPropById(TEST_RETINAFLASH) + "_report";
str_count_prop = getItemPropById(TEST_RETINAFLASH) + "_count";
}
editor.putLong(str_count_prop, 0);
editor.commit();
}
@Override
protected Boolean doInBackground(Long... longs) { //AsyncTask异步任务异步执行的内容,子线程中
Log.d(TAG, "doInBackground: true");
UtilLog.d(TAG, "--------进入补光测试异步任务");
while ((System.currentTimeMillis() - enterTime) < longs[0]) { //测试时间内
if (isCancelled()) { //收到标志异步任务已经中断
editor.putLong(str_count_prop, count); //提交次数结果
editor.commit();
editor.putString(str_report_prop, "FAIL"); //任务中断测试结果视为失败
editor.commit();
setRetinaFlash(false); //异步任务结束前取消屏幕补光
return null;
}
try {
publishProgress(WHITE_FRAMELAYOUT_INVISIABLE_CODE); //发送隐藏白屏FrameLayout的消息
setRetinaFlash(false); //取消屏幕补光
Thread.sleep(RETINA_FLASH_INERVAL_TIME); //取消屏幕补光间隔
publishProgress(WHITE_FRAMELAYOUT_VISIABLE_CODE); //发送显示白屏FrameLayout的消息
setRetinaFlash(true); //打开屏幕补光
Thread.sleep(RETINA_FLASH_TIME); //打开屏幕补光时间
} catch (InterruptedException e) {
e.printStackTrace();
}
int remainTime = (int) (longs[0] - (System.currentTimeMillis() - enterTime)) / (60 * 1000); //计算剩余测试时间
count++; //计算测试次数
publishProgress(remainTime, count); //发送remainTime, count更新UI
}
setRetinaFlash(false); //异步任务结束前取消屏幕补光
return null;
}
@Override
protected void onProgressUpdate(Integer... values) { //进度更新
super.onProgressUpdate(values);
if (values != null && values.length == 1){ //接收到一个参数
if (values[0] == WHITE_FRAMELAYOUT_VISIABLE_CODE) { //补光显示白屏FrameLayout
whiteFrameLayout.setVisibility(View.VISIBLE);
} else if (values[0] == WHITE_FRAMELAYOUT_INVISIABLE_CODE) { //补光间隔隐藏白屏FrameLayout
whiteFrameLayout.setVisibility(View.INVISIBLE);
}
} else if (values != null && values.length > 1) { //接收到两个个参数,更新UI
String tmpStr = String.format(getString(R.string.remainder_times), values[0]);
remainTimeTextView.setText(tmpStr);
tmpStr = String.format(getString(R.string.tested_counts), values[1]);
countTextView.setText(tmpStr);
}
}
@Override
protected void onPostExecute(Boolean aBoolean) {
Log.d(TAG, "onPostExecute: true");
super.onPostExecute(aBoolean);
if ((System.currentTimeMillis() - enterTime) < testTime) {
Log.d(TAG, "onPostExecute: TEST FAIL");
UtilLog.d(TAG, "--------补光测试失败");
editor.putLong(str_count_prop, count); //提交次数结果
editor.commit();
editor.putString(str_report_prop, "FAIL");
editor.commit();
startMyActivity(RetinaFlashTestActivity.this, AgingTestActivityExt.class);
} else {
Log.d(TAG, "onPostExecute: TEST PASS");
UtilLog.d(TAG, "--------补光测试成功");
editor.putLong(str_count_prop, count); //提交次数结果
editor.commit();
editor.putString(str_report_prop, "PASS");
editor.commit();
}
}
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d(TAG, "onDestroy: true");
retinaFlashTask.cancel(true); //设置中断AsyncTask异步任务
}