AsyncTask 异步任务

1.  为何要有异步任务?    android

① 若是在子线程操做一些耗时的操做容易形成卡顿spring

② android规定主线程中不能够作http连接操做异步

2.为何会有AsyncTaskide

① 子线程中更新UI       源码分析

② 封装,简化异步操做url

3.构建AsyncTask子类的参数spa

AsyncTask<Params,Progress,Result>是一个抽象类,一般用于被继承,有三个参数.net

Params :启动任务时输入参数的类型线程

Progress:后台任务执行中返回进度值的类型code

Result:后台执行任务完成后返回结果的类型

4.须要重写的方法

doInBackground :须要重写,异步执行后台线程将要完成的任务

② onPreExecute:执行后台耗时操做前被调用,一般用户完成一些初始化操做

onPostExecute:当doInBackground()完成后,系统会自动调用onPostExecute(),并将doInBackground  方法返回的值传给该方法

onProgressUpdate:在doInBackground()方法中调用publishProgress()方法,更新任务的执行进度后,  就会触发该方法

 

5.使用时的注意事项

① 必须在UI线程中建立AsyncTask实例和调用execute方法

② 重写的四个方法是系统自动调用的,不该该手动调用

③ 每一个AsyncTask只能被执行一次,多吃哦调用将会引起异常

    

AsyncTask请求图片

private class MyAsyncTask extends AsyncTask<String, Integer, Bitmap> {


    private Bitmap bitmap;

    @Override
    protected Bitmap doInBackground(String... params) {
        //获取传递进来的参数
        String url = params[0];
        try {
            URL url1 = new URL(url);
            URLConnection urlConnection = url1.openConnection();
            InputStream is = urlConnection.getInputStream();
            BufferedInputStream bis = new BufferedInputStream(is);
            //经过decodeStream解析输入流
            bitmap = BitmapFactory.decodeStream(bis);
            is.close();
            bis.close();

        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return bitmap;
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }

    @Override
    protected void onPostExecute(Bitmap bitmap) {
        super.onPostExecute(bitmap);
        img.setImageBitmap(bitmap);
    }

    @Override
    protected void onProgressUpdate(Integer... values) {
        super.onProgressUpdate(values);

    }
}

 

AsyncTask加载进度条

private class MyAsyncTask2 extends AsyncTask<Void, Integer, Void> {

    @Override
    protected Void doInBackground(Void... params) {
        for (int i = 0; i < 100; i++) {
            if(isCancelled()){
                break;
            }
            publishProgress(i);
            try {
                Thread.sleep(200);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        return null;
    }

    @Override
    protected void onProgressUpdate(Integer... values) {
        super.onProgressUpdate(values);
        if(isCancelled()){
            return;
        }
        progressbar.setProgress(values[0]);
    }
}

 

源码分析参考地址   

http://blog.csdn.net/iispring/article/details/50670388

 

深刻理解AsyncTask

This class allows to perform background operations and publish results on the UI thread without having to manipulate threads and/or handlers.

意思是这个类使得:不使用Thread和Handler,就能够在后台执行操做而后在发布结果到UI线程。其实他内部的实现就是封装了Thread和Handler,因此你就没必要要直接用这两个低层类了,但他的目的也是代码复用,他的实现跟咱们上面写的类也差很少。主要有这几点不一样:1、AsyncTask使用了线程池而不是单个线程去执行后台任务,该线程池是整个进程共用的,是由于他的线程池对象是一个静态成员变量,这一点不少人搞错,误觉得AsyncTask越多建立的线程越多,这不是绝对正确的,由于线程池会根据负载动态调整的,并且有最大值和空闲超时,AsyncTask的配置是最小5,最大128,空闲超时1秒,固然你也能够配置成线程数根据任务数线程递增;2、AsyncTask的输入和输出参数使用了泛型;3、AsyncTask支持中断当前任务。

相关文章
相关标签/搜索