Android异步图片加载

时间:2012-01-16 21:59:09

标签: android

所以我有一个使用ImageView的活动。我的目标是让活动开始并异步地获取我需要的图像。在获取图像时,我想显示某种旋转加载符号来代替图像。我已经尝试将AsyncTask用作一个单独的类,但遇到了与修改另一个活动的视图有关的问题。我在活动中尝试了一个匿名的Runnable类,但它似乎没有产生我期望的效果。有人可以建议吗?

已解决:只需要活动中的处理程序

    final Handler handler = new Handler() {
          public void  handleMessage(Message msg) {
              ImageView qrCode =  (ImageView)findViewById(R.id.qr); 
              qrCode.setImageBitmap((Bitmap)msg.obj);
          }
     };


    new Thread(new Runnable(){

            public void run() {
                BitmapFactory.Options bmOptions;
                bmOptions = new BitmapFactory.Options();
                bmOptions.inSampleSize = 1;
                int retry = 0;
                Bitmap bm = null;
                while(retry < 50 && bm == null){
                    bm = LoadImage(image_URL, bmOptions);
                    if(bm == null){
                        try {
                            Thread.sleep(100);
                        } catch (InterruptedException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                    }
                    retry++;
                }
                Message msg = new Message();
                msg.obj = bm;
                handler.sendMessage(msg);
                return;
            } 


    }).start();
    `

3 个答案:

答案 0 :(得分:0)

使用imageview在视图内放置一个进度对话框。 设置imageview ImageView.visibility(View.INVISIBLE);

在AsyncTask中的preExecute()

显示旋转对话框,然后在AsyncTask的doInBackground()中进行提取

在onPostExecute()中,通过更改可见性并关闭对话框或将其可见性设置为View.GONE来显示您的imageview

答案 1 :(得分:0)

Android的线程开发者指南应该可以帮到你。它有AsyncTask示例,几乎完全符合您的要求: Android Threading Guide

如果你没有实现publishProgress()方法,并且只实现doInBackground来获取数据,而onPostExecute则用来更新UI,那么默认情况下它应该为你提供旋转图标来指示它正在加载。请记住,onPostExecute在主UI线程上运行,因此您无法从那里进行任何网络调用

答案 2 :(得分:0)

我根据本教程做了类似的事情:

http://evancharlton.com/thoughts/lazy-loading-images-in-a-listview