基本用法
继承时为AsyncTask类指定三个泛型参数,
- Params
在执行AsyncTask时需要传入的参数,可用于在后台任务中使用。 - Progress
后台任务执行时,如果需要在界面上显示当前的进度,则使用这里指定的泛型作为进度单位。 - Result
当任务执行完毕后,如果需要对结果进行返回,则使用这里指定的泛型作为返回值类型。
实现一个显示图片的功能
public class ShowPicTask extends AsyncTask<String, Integer, Bitmap> {
private ImageView mImageView;
private ProgressBar mProgressBar;
public ShowPicTask(ImageView imageView, ProgressBar progressBar) {
mImageView = imageView;
mProgressBar = progressBar;
}
// 在后台任务开始执行之前调用,用于进行一些界面上的初始化操作,如显示一个进度条对话框
@Override
protected void onPreExecute() {
mProgressBar.setProgress(0);
}
// 子线程中运行,任务完成会return执行结果
@Override
protected Bitmap doInBackground(String... strings) {
Bitmap bitmap = null;
try {
URL imageUrl = new URL(strings[0]);
HttpURLConnection conn = (HttpURLConnection) imageUrl
.openConnection();
conn.setConnectTimeout(10000);
conn.setRequestMethod("GET");
if (conn.getResponseCode() == 200) {
InputStream is = conn.getInputStream();
bitmap = BitmapFactory.decodeStream(is);
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (ProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return bitmap;
}
// 进行UI操作
@Override
protected void onProgressUpdate(Integer... values) {
mProgressBar.setProgress(values[0]);
}
// 任务执行完会retrun结果,就好执行此方法,返回结果做为参数传到此方法中
@Override
protected void onPostExecute(Bitmap result) {
mProgressBar.setVisibility(View.GONE);
mImageView.setImageBitmap(result);
}
}
执行异步任务
new ShowPicTask(imageView, progressBar).execute("https://www.baidu.com/img/bdlogo.png");
基本原理
//早期版最多同时执行5个线程,多余的需要等待,同时执行超过128个线程时会崩溃
// CPU 数量决定
private static final int CPU_COUNT = Runtime.getRuntime().availableProcessors();
private static final int CORE_POOL_SIZE = CPU_COUNT + 1;
private static final int MAXIMUM_POOL_SIZE = CPU_COUNT * 2 + 1;
private static final int KEEP_ALIVE = 1;
……
// 采用线程池执行
private static final ThreadPoolExecutor sExecutor = new ThreadPoolExecutor(CORE_POOL_SIZE,
MAXIMUM_POOL_SIZE, KEEP_ALIVE, TimeUnit.SECONDS, sWorkQueue, sThreadFactory);
excute() 方法调用 excuteOnExecuteor
先调用onPreExecute,然后再使用线程池执行异步任务
采用Handler 进行通知,创建的Handler使用的是主线程的Looper,