AsyncTask-异步任务

AsyncTask-异步任务

AsyncTask

构建AsyncTask子类的回调方法

AsyncTask主要有如下几个方法:

doInBackground:必须重写,异步执行后台线程要完成的任务,耗时操作将在此方法中完成.

onPreExecute:执行后台耗时操作前被调用,通常用于进行初始化准备操作.

onPostExecute:当doInBackground方法完成后,系统将自动调用此方法,并将doInBackground方法返回的值传入此方法.通过此方法进行UI的更新.

onProgressUpdate:当在doInBackground**方法中调用**publishProgress方法更新任务执行进度后,将调用此方法.通过此方法我们可以知晓任务的完成进度.

下面通过代码演示一个典型的异步处理的实例–加载网络图片.网络操作作为一个不稳定的耗时操作,从4.0开始就被严禁放入主线程中.所以在显示一张网络图片时,我们需要在异步处理中下载图片,并在UI线程中设置图片.

String url = ''; 
new MyAsyncTask().execute(url);//这里设置要传递进去的数据,可多个
class MyAsyncTask extends AsyncTask<String, Void, Bitmap> {
    @Override
    protected void **onPreExecute**() {
        super.onPreExecute();
        pb.setVisibility(View.VISIBLE);
    }
    @Override
    protected void onPostExecute(Bitmap result) {
        super.onPostExecute(result);
        pb.setVisibility(View.GONE);
        imageView.setImageBitmap(result);

    }
    @Override
    protected Bitmap doInBackground(String... params) {
        //获取传递进来的参数
        String url = params[0];
        Bitmap bm = null;
        InputStream is;
        try {
            URLConnection conn = new URL(url).openConnection();
            is = conn.getInputStream();
            BufferedInputStream br = new BufferedInputStream(is);
            bm = BitmapFactory.decodeStream(is);
            is.close();
            br.close();
        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return bm;
    }

    new MyAsyncTask().execute();//没有要传递的参数
    protected void onPause() {
        super.onPause();
        if(task != null && task.getStatus() == AsyncTask.Status.RUNNING){
            task.cancel(true);//取消这个asynctask
        }
}

    class MyAsyncTask extends AsyncTask<Void, Integer, Void>{

    @Override
    protected Void doInBackground(Void... params) {
        for(int i = 0; i<100 ;i++){
            if(isCancelled()){
                break;//获取线程状态,跳出循环
            }
            publishProgress(i);//把进度传到onProgressUpdate的values中
            try {
                Thread.sleep(300);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        return null;
    }
    @Override
    protected void onProgressUpdate(Integer... values) {
        super.onProgressUpdate(values);
        if(isCancelled()){
            return;//结束这个task
        }
        pb.setProgress(values[0]);//从values中拿出进度
    }
}

.使用AsyncTask的注意事项

① 必须在UI线程中创建AsyncTask的实例.

② 只能在UI线程中调用AsyncTask的execute方法.

③ AsyncTask被重写的四个方法是系统自动调用的,不应手动调用.

④ 每个AsyncTask只能被执行(execute方法)一次,多次执行将会引发异常.

⑤ AsyncTask的四个方法,只有doInBackground方法是运行在其他线程中,其他三个方法都运行在UI线程中,也就说其他三个方法都可以进行UI的更新操作.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值