Android 异步加载图片


1.构建AsyncTask子类参数:

有三个泛型参数:AsyncTask<Params,Progress,Result>

指定三个泛型参数:params:启动任务时输入参数类型;

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

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

2.构建AsyncTask 子类回调方法:

  doInBackground();必须重写,后台线程将要完成的任务;

  doPreExecute:完成初始化操作;

  doPostExecute:doInBackground()中返回值传递给该方法;

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

 3.AsyncTask 使用的注意要点:

 (1)必须在UI 线程中创建实例,调用execute()方法;

 (2)每个AsyncTask 只能够调用execute()方法一次,不能重复调用;

 (3)只有doInBackground()在其他线程中,不能直接更新UI,其他回调方法可以更新UI.

  (4)AsyncTask底层还是线程池,当前面task没有完成,后面也不会执行,所以要有个cancel task 的步骤。

     但是要注意task.cancel(true)方法只是将task标记为cancel,所以在其他回调方法中需要检查isCancelled()


下面是两个简单的AsyncTask 的例子:

1.这是一个模拟进度条的主要代码:

<strong style="color: rgb(255, 0, 0);"> </strong>class MyAsyncTask extends AsyncTask<Void,Integer,Void>{
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }

        @Override
        protected void onPostExecute(Void aVoid) {
            super.onPostExecute(aVoid);
        }

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

        @Override
        protected Void doInBackground(Void... params) {
            //模拟进度更新
            for (int i = 0; i <100; i++) {
                if(isCancelled()){
                    break;
                }
                publishProgress(i);
                try {
                    Thread.sleep(300);//增加睡眠时间

                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }

            return null;
        }
    }

2.这是模拟从网络上加载图片的主要代码:

 class MySyncTask extends AsyncTask<String,Void,Bitmap>{

        @Override
        protected Bitmap doInBackground(String... params) {
            String url=params[0];
            InputStream is;
            Bitmap bm=null;
            HttpURLConnection conn;

            try {
                conn= (HttpURLConnection) new URL(url).openConnection();
                is=conn.getInputStream();
                BufferedInputStream bis=new BufferedInputStream(is);//为什么要用包装流
                bm= BitmapFactory.decodeStream(bis);
                is.close();
                bis.close();

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


            return bm;
        }

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            pb.setVisibility(View.VISIBLE);
        }

        @Override
        protected void onPostExecute(Bitmap bitmap) {
            super.onPostExecute(bitmap);
            im.setImageBitmap(bitmap);
            pb.setVisibility(View.GONE);
        }

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



        }
    }

然后只要在主线程中创建实例,调用execute()方法即可。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值