Android - 用asynctask加载图片的Listview - 有时候有时候不显示图片

时间:2014-03-21 18:19:21

标签: android android-listview android-asynctask

我正在尝试应用asynctask在listview项目中加载图像。

我还试图比较两个值,以便知道视图是否仍然需要加载图像。

        @Override
    public void bindView(View view, Context context, Cursor cursor) {
      holder = (ViewHolder) view.getTag();
      picPath = cursor.getString(18);

        if(picPath == null || picPath.isEmpty()){

          holder.myImage.setVisibility(View.GONE);

        }else{

          savingPath = picPath;

          AsyncTask<Void, Void, Void> showImage = new AsyncTask<Void, Void, Void>(){


                Bitmap b1;
                String syncPath;
                @Override
                protected Void doInBackground(Void... params) {

                    syncPath = savingPath;
                    b1 = setImageToImageView(syncPath);
                    return null;
                    }

                @Override
                protected void onPostExecute(Void result) {


                if (syncPath.equalsIgnoreCase(picPath)){

                    holder.myImage.setTag(syncPath);
                    holder.myImage.setImageBitmap(b1);
                    holder.myImage.setVisibility(View.VISIBLE);

                }else{


                    }

                    }

}

}

};
showImage.execute();

通过比较这两者 - 我想知道是否仍然需要用图像加载视图。

if (syncPath.equalsIgnoreCase(picPath))

我得到的是,有时它会加载图像,有时只加载少量图像,而且图像总是相同。

所以我在这里做错了什么?

感谢您提供任何帮助

修改

这是我所做的更改(仍然没有工作 - 使应用程序崩溃)

                 if(holder != null && holder.bitImage != null) {

                 holder.myImage.setImageBitmap(holder.bitImage);
                 holder.myImage.setVisibility(View.GONE);
             }else{

             savingPath = picPath;

             AsyncTask<Void, Void, Void> showImage = new AsyncTask<Void, Void, Void>(){

             Bitmap b1;
             String syncPath;

             @Override
                protected Void doInBackground(Void... params) {

                    syncPath = savingPath;
                    b1 = setImageToImageView(syncPath);
                    return null;
                }

             @Override
                protected void onPostExecute(Void result) {

                    holder.myImage.setTag(syncPath);
                    holder.myImage.setImageBitmap(holder.bitImage);
                    holder.bitImage = b1;
                    holder.myImage.setVisibility(View.VISIBLE);
                }


            };
            showImage.execute();

2 个答案:

答案 0 :(得分:0)

由于savingPath在所有AsyncTasks之间共享,因此您可能遇到了同步问题。我建议您使用一些流行的库来加载图像:

这些是最受欢迎的。它们非常易于使用,除了它们内置缓存之外,因此您无需检查URL是否相同 - 如果图像已经加载,库将从其缓存中加载图像。

答案 1 :(得分:0)

我真的不需要你的if(picPath == null || picPath.isEmpty())条件,因为如果你已经下载了图像,你可以设置位图来查看持有者以保持位图对象。在holder中添加一个字段为 Bitmap bitImage 并分配b1。

改变这个..

 if(picPath == null || picPath.isEmpty())

as ..

 if(holder != null && holder.bitImage != null)
 {
  // set bitmap
  holder.myImage.setImageBitmap(holder.bitImage)
 }
 else 
 {
   // load the image using async task and set it to holder.bitImage 
   // also set it to the image view
   holder.myimage.setImageBitmap(b1);  // lets assume b1 is your image bitmap
   holder.bitImage = b1;

}