简介
Android中的AsyncTask适用于简单的异步任务处理。
AsyncTask是封装过的后台任务类,异步任务。它大大降低了开发难度。
复杂的异步任务开发推荐使用Handler加Thread。
为什么要用异步?
耗时操作不在UI线程中执行,会导致UI堵塞,严重影响用户体验。
Android中网络操作如果在UI线程中执行会直接报错。
功能介绍
- AsyncTask定义了三种泛型类型 Params,Progress和Result。
- Params启动后台任务的输入参数
- Progress后台执行任务的进度
- Result后台执行任务的返回结果
- doInBackground抽象方法必须实现,耗时的操作都放这里。不可对UI操作。
- onPreExecute执行doInBackground前的预处理
- onProgressUpdate可以再执行doInBackground过程中对UI进行更新,doInBackground通过publishProgress方法向它发送消息
- onPostExecute执行完doInBackground后调用,doInBackground的执行结果会作为参数传入
- onCancelled取消时进行的操作
注意事项
- AsyncTask只能在UI线程中创建
- Execute方法只能在UI线程调用
- Execute方法不能重复被调用
实例1-下载:
package com.example.asynctaskdemo;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import android.widget.ProgressBar;
public class DownloadTest extends Activity {
private static final String URL = "https://imgblog.csdnimg.cn/20190321140536348.png";
ImageView mImageView;
ProgressBar mProgressBar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.download_activity);
mImageView = (ImageView) findViewById(R.id.image);
mProgressBar = (ProgressBar) findViewById(R.id.progressbar);
new DownLoadTask().execute(URL);
}
class DownLoadTask extends AsyncTask<String, Void, Bitmap> {
@Override
protected void onPreExecute() {
super.onPreExecute();
mProgressBar.setVisibility(View.VISIBLE);
}
@Override
protected Bitmap doInBackground(String... params) {
Bitmap mBitmap = null;
String url = params[0];
URLConnection connection;
InputStream is;
try {
connection = new URL(url).openConnection();
is = connection.getInputStream();
BufferedInputStream bis = new BufferedInputStream(is);
mBitmap = BitmapFactory.decodeStream(bis);
is.close();
bis.close();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return mBitmap;
}
@Override
protected void onPostExecute(Bitmap result) {
super.onPostExecute(result);
mImageView.setImageBitmap(result);
mImageView.setVisibility(View.VISIBLE);
mProgressBar.setVisibility(View.GONE);
}
}
}
实例2-更新Progress:
package com.example.asynctaskdemo;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.widget.ProgressBar;
public class ProgressTest extends Activity {
private ProgressBar mProgressBar;
private ProgressTask mProgressTask;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.progress_activity);
mProgressBar = (ProgressBar) findViewById(R.id.progressbar);
mProgressTask = new ProgressTask();
mProgressTask.execute();
}
class ProgressTask extends AsyncTask<Void, Integer, Void> {
@Override
protected Void doInBackground(Void... params) {
for (int i = 1; i <= 100; i++) {
if(isCancelled()) {
return null;
}
try {
Thread.sleep(250);
} catch (InterruptedException e) {
e.printStackTrace();
}
publishProgress(i);
}
return null;
}
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
mProgressBar.setProgress(values[0]);
}
}
@Override
protected void onPause() {
super.onPause();
if (mProgressTask !=null && mProgressTask.getStatus() == AsyncTask.Status.RUNNING) {
mProgressTask.cancel(false);
}
}
}
实例3-直接运行runnable:
package com.example.asynctaskdemo;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
public class RunnableTest extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
AsyncTask.execute(new Runnable(){
@Override
public void run() {
for (int i = 1; i <= 20; i++) {
try {
Log.i(TAG, "RunnableTest:"+i);
Thread.sleep(250);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
}
}