【问题标题】:Android listview image lagAndroid listview 图像滞后
【发布时间】:2010-11-26 04:09:06
【问题描述】:

我的应用程序包含一个列表视图,可以选择包含来自用户 sd 卡的图像。它工作正常,但是当加载任何图像时都会出现明显的延迟。我的 getView 中有这个:

          BitmapFactory.Options o = new BitmapFactory.Options();
             o.inJustDecodeBounds = true;
             BitmapFactory.decodeFile(image, o);
             final int REQUIRED_SIZE=70;

             //Find the correct scale value. It should be the power of 2.
             int width_tmp=o.outWidth, height_tmp=o.outHeight;
             int scale=1;
             while(true){
                 if(width_tmp/2<REQUIRED_SIZE || height_tmp/2<REQUIRED_SIZE)
                     break;
                 width_tmp/=2;
                 height_tmp/=2;
                 scale++;
             }

             //Decode with inSampleSize
             BitmapFactory.Options o2 = new BitmapFactory.Options();
             o2.inSampleSize=scale;
             Bitmap myBitmap = BitmapFactory.decodeFile(image, o2);
             image_main.setImageBitmap(myBitmap);

有什么建议吗?

编辑:用这个替换了上面的内容,但没有加载图像......

            class Thumbnailer extends AsyncTask<String, Void, Bitmap> {
                    String image;

                    @Override
                    protected void onPostExecute(Bitmap result) {
                        image_main.setImageBitmap(result);
                    }
                    @Override
                     protected void onProgressUpdate(Void... progress) {
                     }

                    @Override
                    protected Bitmap doInBackground(String... params) {
                         BitmapFactory.Options o = new BitmapFactory.Options();
                         o.inJustDecodeBounds = true;
                         BitmapFactory.decodeFile(image, o);
                         final int REQUIRED_SIZE=70;

                         //Find the correct scale value. It should be the power of 2.
                         int width_tmp=o.outWidth, height_tmp=o.outHeight;
                         int scale=1;
                         while(true){
                             if(width_tmp/2<REQUIRED_SIZE || height_tmp/2<REQUIRED_SIZE)
                                 break;
                             width_tmp/=2;
                             height_tmp/=2;
                             scale++;
                         }
                         //Decode with inSampleSize
                         BitmapFactory.Options o2 = new BitmapFactory.Options();
                         o2.inSampleSize=scale;                                  
                         return BitmapFactory.decodeFile(image, o2);
                    }
                } 
                new Thumbnailer().execute(image);

【问题讨论】:

    标签: android listview


    【解决方案1】:

    使用占位符图像显示行。在AsyncTask 中完成您的BitmapFactory 工作,完成后更新ImageView(如果ImageView 尚未回收,因此仍需要此特定缩略图)。缓存您的工作,这样您就不必再次重新进行所有缩放,至少对于 ListView 的这个化身,如果图像不会更改,可能会更长。

    【讨论】:

    • 感谢您的回复..我正在尝试使用 AsyncTask,但无法使其正常工作..我已经更新了我的第一篇文章以向您展示我所做的事情。我从来没有弄乱过 AsyncTask 所以我可能做错了。我在这里几乎是初学者;)
    • @Paul:很难帮助拒绝说出“无法正常工作”是什么意思的人。据我所知,您正试图将每个图像加载到单个 ImageView 小部件中,这似乎不太可能。您需要将 ImageView 传递到您正在使用此特定任务处理的行中。
    • 我认为问题是我实际上并没有使用我传递给 inBackground 的图像字符串
    • @commonsware 抱歉,它没有显示图像...打开正常等等
    • 我已将其更改为:BitmapFactory.decodeFile(params, o);但是现在 Bigmapfactory 不认为 params 是一个字符串
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-31
    相关资源
    最近更新 更多