美文网首页
Android_AsyncTask

Android_AsyncTask

作者: 738bc070cd74 | 来源:发表于2015-09-06 15:20 被阅读70次

基本用法

继承时为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); 
execute.png

excute() 方法调用 excuteOnExecuteor


excuteOnExecuteor.png

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

handler.png

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

相关文章

  • Android_AsyncTask

    基本用法 继承时为AsyncTask类指定三个泛型参数, Params在执行AsyncTask时需要传入的参数,可...

  • Android_AsyncTask个人笔记

    title: Android_AsyncTask 目的 ​ 异步任务允许你在用户的接口上执行异步工作。将线程阻...

  • Android_AsyncTask源码解析

    实现原理: 线程池+Handler 用到的数据结构:LinkedBlockQueue, 这说明AsyncTask是...

  • android_AsyncTask的源码解析

    AsyncTask的相关结论 下面是AsyncTask的相关结论,相关结论都会在下面的源码分析中一一印证。 onP...

网友评论

      本文标题:Android_AsyncTask

      本文链接:https://www.haomeiwen.com/subject/wwhrcttx.html