AsyncTask 异步任务

1.  为什么要有异步任务?    

① 如果在子线程操作一些耗时的操作容易造成卡顿

② android规定主线程中不可以做http链接操作

2.为什么会有AsyncTask

① 子线程中更新UI       

② 封装,简化异步操作

3.构建AsyncTask子类的参数

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

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

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

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,所以你就不必要直接用这两个低层类了,但他的目的也是代码复用,他的实现跟我们上面写的类也差不多。主要有这几点不同:一、AsyncTask使用了线程池而不是单个线程去执行后台任务,该线程池是整个进程共用的,是因为他的线程池对象是一个静态成员变量,这一点很多人搞错,误以为AsyncTask越多创建的线程越多,这不是绝对正确的,因为线程池会根据负载动态调整的,而且有最大值和空闲超时,AsyncTask的配置是最小5,最大128,空闲超时1秒,当然你也可以配置成线程数根据任务数线程递增;二、AsyncTask的输入和输出参数使用了泛型;三、AsyncTask支持中断当前任务。

转载于:https://my.oschina.net/u/3705875/blog/1606384

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值