Android_AsyncTask

基本用法

继承时为AsyncTask类指定三个泛型参数,

  • Params
    在执行AsyncTask时需要传入的参数,可用于在后台任务中使用。
  • Progress
    后台任务执行时,如果需要在界面上显示当前的进度,则使用这里指定的泛型作为进度单位。
  • Result
    当任务执行完毕后,如果需要对结果进行返回,则使用这里指定的泛型作为返回值类型。

实现一个显示图片的功能

public class ShowPicTask extends AsyncTask {

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); 
execute.png

excute() 方法调用 excuteOnExecuteor


Android_AsyncTask_第1张图片
excuteOnExecuteor.png

先调用onPreExecute,然后再使用线程池执行异步任务

Android_AsyncTask_第2张图片
handler.png

采用Handler 进行通知,创建的Handler使用的是主线程的Looper,

你可能感兴趣的:(Android_AsyncTask)