AsyncTask的使用
2018-10-14 本文已影响0人
simit
AsyncTask是一种轻量级的异步任务类,是在线程池中执行后台任务,然后把任务的结果和任务执行的进度传递给主线程进行UI的更新。
AsyncTask的使用:
public class AsyncTaskTest extends AsyncTask<String,Integer,Bitmap> {
private static final String TAG = "AsyncTaskTest";
private ImageView imageView;
private ProgressBar pb;
public AsyncTaskTest(ImageView imageView, ProgressBar pb) {
this.imageView = imageView;
this.pb = pb;
}
//主线程中执行,异步任务执行之前调用
@Override
protected void onPreExecute() {
super.onPreExecute();
}
//主线程中执行,异步任务执行之后,返回值为异步任务的结果
@Override
protected void onPostExecute(Bitmap bitmap) {
super.onPostExecute(bitmap);
pb.setVisibility(View.GONE);
imageView.setImageBitmap(bitmap);
}
//主线程中执行,异步任务执行的进度发生改变的时候调用
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
//更新进度条
Log.i(TAG,"onProgressUpdate "+values[0]);
pb.setProgress(values[0]);
}
//线程池中执行,用于执行异步任务,参数表示异步任务的请求参数,此方法中可调用
//publishProgress 更新进度,publishProgress 会调用onProgressUpdate
@Override
protected Bitmap doInBackground(String... strings) {
for (int i = 0; i < 100; i++) {
try {
Thread.sleep(100);
publishProgress(i);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
try {
URLConnection URLConnection = new URL(strings[0]).openConnection();
InputStream inputStream = URLConnection.getInputStream();
BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
Bitmap bitmap = BitmapFactory.decodeStream(bufferedInputStream);
inputStream.close();
bufferedInputStream.close();
return bitmap;
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
然后在主线程中实例AsyncTask并调用execute方法即可。
使用AsyncTask的注意事项:
1.AsyncTask的对象必须在主线程中创建并在主线程中调用execute方法。
2.不能手动调用onPreExcute,onPostExecute,doInBackground和onProgressUpdate方法。
3.AsyncTask的任务只能执行一次,否则会报运行时异常。
AsyncTask中有两个线程池,SerialExecutor 和 THREAD_POOL_EXECUTOR 还有一个Handler——InternalHandler,其中线程池SerialExecutor 用于任务的排队,而线程池THREAD_POOL_EX
ECUTOR 负责真正的执行任务,InternalHandler负责将执行环境从线程池切换到主线程。