安卓开发中,初学阶段对于耗时操作一般都用子线程来实现,但是这种方式很不规范 , 第一: 子线程开的多了造成资源浪费; 第二 :由于子线程属于异步,主线程退出时该子线程可能还在执行,这就造成了内存泄漏,
所以, 子线程不能盲目的去使用,这时 我们可以通过 使用 AsyncTask 来执行异步任务, 这样在Activity退出时 可以取消正在进行的任务,避免了内存泄漏 ,而且 请求的过程可控 , 这使得更新UI变得异常便捷...
废话不多说,接下来开始我们今天的代码:
/**
* 创建异步任务类
*/
class MyAsyncTask extends AsyncTask<String, Integer, Boolean> {
private ProgressDialog dialog;
private boolean isContinue = true;
private int index = 100;
/**
* 任务执行前的操作 可以在这里进行准备的操作 比如显示进度条
*/
@Override
protected void onPreExecute() {
super.onPreExecute();
dialog = new ProgressDialog(context);
dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
dialog.setMax(100);
dialog.setMessage("拼命加载中...");
dialog.show();
}
/**
* 此方法在子线程中调用,可以在此进行耗时操作
*
* @param params
* 任务执行时 传入的参数 长度可变
* @return 任务执行完以后的返回值 也是第三个泛型类型
*/
@Override
protected Boolean doInBackground(String... params) {
while (isContinue) {
if (index > 0) {
index -= 10;
SystemClock.sleep(100);
// 为onProgressUpdate() 传递进度
publishProgress(100 - index);
} else {
SystemClock.sleep(800);
return true;
}
}
return false;
}
/**
* 任务执行进度更新时的回调方法 在次更新进度
*
* @param values
* 第二个泛型类型 当前进度
*/
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
dialog.setProgress(values[0]);
}
/**
* 异步任务任务执行完以后 在主线程中调用
*
* @param aBoolean
* doInBackground()方法的返回值
*/
@Override
protected void onPostExecute(Boolean aBoolean) {
super.onPostExecute(aBoolean);
if (aBoolean) {
Toast.makeText(context, "任务执行完成", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(context, "任务执行出错", Toast.LENGTH_SHORT).show();
}
dialog.dismiss();
}
}
@Override
protected void onDestroy() {
// 界面退出时 取消正在执行的任务
if (asyncTask != null) {
asyncTask.cancel(true);
}
super.onDestroy();
}
/**
* 创建异步任务类
*/
class MyAsyncTask extends AsyncTask<String, Integer, Boolean> {
private ProgressDialog dialog;
private boolean isContinue = true;
private int index = 100;
/**
* 任务执行前的操作 可以在这里进行准备的操作 比如显示进度条
*/
@Override
protected void onPreExecute() {
super.onPreExecute();
dialog = new ProgressDialog(context);
dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
dialog.setMax(100);
dialog.setMessage("拼命加载中...");
dialog.show();
}
/**
* 此方法在子线程中调用,可以在此进行耗时操作
*
* @param params
* 任务执行时 传入的参数 长度可变
* @return 任务执行完以后的返回值 也是第三个泛型类型
*/
@Override
protected Boolean doInBackground(String... params) {
while (isContinue) {
if (index > 0) {
index -= 10;
SystemClock.sleep(100);
// 为onProgressUpdate() 传递进度
publishProgress(100 - index);
} else {
SystemClock.sleep(800);
return true;
}
}
return false;
}
/**
* 任务执行进度更新时的回调方法 在次更新进度
*
* @param values
* 第二个泛型类型 当前进度
*/
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
dialog.setProgress(values[0]);
}
/**
* 异步任务任务执行完以后 在主线程中调用
*
* @param aBoolean
* doInBackground()方法的返回值
*/
@Override
protected void onPostExecute(Boolean aBoolean) {
super.onPostExecute(aBoolean);
if (aBoolean) {
Toast.makeText(context, "任务执行完成", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(context, "任务执行出错", Toast.LENGTH_SHORT).show();
}
dialog.dismiss();
}
}
@Override
protected void onDestroy() {
// 界面退出时 取消正在执行的任务
if (asyncTask != null) {
asyncTask.cancel(true);
}
super.onDestroy();
}
实例化异步任务
asyncTask = new MyAsyncTask();
// 执行任务
asyncTask.execute();
总结,异步任务是安卓编程入门必学操作,有效的降低了内存泄漏的风险