基本用法
繼承時(shí)為AsyncTask類指定三個(gè)泛型參數(shù)各谚,
- Params
在執(zhí)行AsyncTask時(shí)需要傳入的參數(shù)沛简,可用于在后臺任務(wù)中使用附帽。 - Progress
后臺任務(wù)執(zhí)行時(shí)罢杉,如果需要在界面上顯示當(dāng)前的進(jìn)度粪小,則使用這里指定的泛型作為進(jìn)度單位大磺。 - Result
當(dāng)任務(wù)執(zhí)行完畢后,如果需要對結(jié)果進(jìn)行返回探膊,則使用這里指定的泛型作為返回值類型杠愧。
實(shí)現(xiàn)一個(gè)顯示圖片的功能
public class ShowPicTask extends AsyncTask<String, Integer, Bitmap> {
private ImageView mImageView;
private ProgressBar mProgressBar;
public ShowPicTask(ImageView imageView, ProgressBar progressBar) {
mImageView = imageView;
mProgressBar = progressBar;
}
// 在后臺任務(wù)開始執(zhí)行之前調(diào)用,用于進(jìn)行一些界面上的初始化操作逞壁,如顯示一個(gè)進(jìn)度條對話框
@Override
protected void onPreExecute() {
mProgressBar.setProgress(0);
}
// 子線程中運(yùn)行流济,任務(wù)完成會return執(zhí)行結(jié)果
@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;
}
// 進(jìn)行UI操作
@Override
protected void onProgressUpdate(Integer... values) {
mProgressBar.setProgress(values[0]);
}
// 任務(wù)執(zhí)行完會retrun結(jié)果锐锣,就好執(zhí)行此方法,返回結(jié)果做為參數(shù)傳到此方法中
@Override
protected void onPostExecute(Bitmap result) {
mProgressBar.setVisibility(View.GONE);
mImageView.setImageBitmap(result);
}
}
執(zhí)行異步任務(wù)
new ShowPicTask(imageView, progressBar).execute("https://www.baidu.com/img/bdlogo.png");
基本原理
//早期版最多同時(shí)執(zhí)行5個(gè)線程绳瘟,多余的需要等待雕憔,同時(shí)執(zhí)行超過128個(gè)線程時(shí)會崩潰
// CPU 數(shù)量決定
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;
……
// 采用線程池執(zhí)行
private static final ThreadPoolExecutor sExecutor = new ThreadPoolExecutor(CORE_POOL_SIZE,
MAXIMUM_POOL_SIZE, KEEP_ALIVE, TimeUnit.SECONDS, sWorkQueue, sThreadFactory);
execute.png
excute() 方法調(diào)用 excuteOnExecuteor
excuteOnExecuteor.png
先調(diào)用onPreExecute,然后再使用線程池執(zhí)行異步任務(wù)
handler.png
采用Handler 進(jìn)行通知糖声,創(chuàng)建的Handler使用的是主線程的Looper斤彼,