通用图像加载器列表视图中的错误缩略图

时间:2014-09-07 05:21:51

标签: android image listview universal-image-loader

这个问题在这里被问到:Universal-Image-Loader: wrong Bitmaps are attached to ImageView

我使用的是最新的1.9.3。我在我的应用程序类中实现了这个解决方案:

@Override
public void onCreate() {
    super.onCreate();

    DisplayImageOptions defaultOptions = new DisplayImageOptions.Builder().resetViewBeforeLoading(true).build();
    ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(getApplicationContext())
        .defaultDisplayImageOptions(defaultOptions)
        .build();
    ImageLoader.getInstance().init(config);
}

Android-Universal-Image-Loader doesn't keep loaded images on scroll in gridview,我在我的适配器中加载图像:

ImageAware imageAware = new ImageViewAware(viewHolder.profileIV, false);
ImageLoader.getInstance().displayImage(imgUrl, imageAware);

它仍然无法运作;我想知道是不是因为我必须打电话来获取图片网址,因为提供模型数据的api不包含图片网址。

所以在我的适配器的getView()中,在我使用带有图片网址的imageloader之前,我再做一次异步调用来获取图片网址,如下所示:

 APIclient.getImageJson(getContext(), googleUrl, new JsonHttpResponseHandler() {
        @Override
        public void onSuccess(JSONObject imgJson) {
            try {
                JSONObject responseDataValue = imgJson.getJSONObject("responseData");
                JSONArray resultsValue = responseDataValue.getJSONArray("results");
                JSONObject result = resultsValue.getJSONObject(0);
                String imgUrl = result.getString("url");

                ImageAware imageAware = new ImageViewAware(viewHolder.profileIV, false);
                ImageLoader.getInstance().displayImage(imgUrl, imageAware);
                //ImageLoader.getInstance().displayImage(imgUrl, viewHolder.profileIV);
            }
            catch(Exception e) {
                e.printStackTrace();
            }
        }
这里的google网址如下:https://ajax.googleapis.com/ajax/services/search/images?rsz=1&start=1&v=1.0&q=%22barack%20obama%22

由于名称不同,每行会有不同的URL。我不知道问题是否仍然是一个listview recycer问题,这个问题在通用图像加载程序库中没有修复,或者罪魁祸首在于附加的网络调用。如何使缩略图与旁边的数据保持一致?

1 个答案:

答案 0 :(得分:-1)

我认为这是因为APIclient.getImageJson(...)中的异步通话getView()。在onSuccess()回调被解雇时,这是未知的时间,因此您可以为已经回收的ImageLoader.getInstance().displayImage(...)致电ImageView

我可以建议你加入这两个异步操作(通过APIclient获取JSON,通过ImageLoader加载图像)。实现自己的ImageDoanloader,它将处理谷歌JSON URL(https://ajax.googleapis.com/ajax/services/search/images?rsz=1&start=1&v=1.0&q=%22barack%20obama%22),提取图像URL和加载图像。

让我们介绍一下我们自己的URI方案 - “json”。所以我们知道像“json:// ...”这样的传入URI对应于JSON链接。

  1. 准备自己的下载器:

    public class JsonImageDownloader extends BaseImageDownloader {
    
        public static final String SCHEME_JSON = "json";
        public static final String SCHEME_JSON_PREFIX = SCHEME_JSON + "://";
    
        public JsonImageDownloader(Context context) {
            super(context);
        }
    
        public JsonImageDownloader(Context context, int connectTimeout, int readTimeout) {
            super(context, connectTimeout, readTimeout);
        }
    
        @Override
        public InputStream getStream(String uri, Object extra) throws IOException {
            if (uri.startsWith(SCHEME_JSON_PREFIX)) {
                String jsonUri = uri.substring(SCHEME_JSON_PREFIX.length());
                JSONObject imgJson = APIclient.getImageJson(context, jsonUri); // sync JSON loading
                try {
                    JSONObject responseDataValue = imgJson.getJSONObject("responseData");
                    JSONArray resultsValue = responseDataValue.getJSONArray("results");
                    JSONObject result = resultsValue.getJSONObject(0);
                    String imgUrl = result.getString("url");
                    return super.getStream(imgUrl, extra);
                } catch (JSONException e) {
                    throw new RuntimeException(e);
                }
            } else {
                return super.getStream(uri, extra);
            }
        }
    }
    
  2. 将其设置为配置

    ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context)
            .imageDownloader(new JsonImageDownloader(context))
            ....
            .build();
    
  3. getView(...)中使用ImageLoader而不使用APIclient

    ImageAware imageAware = new ImageViewAware(viewHolder.profileIV, false);
    ImageLoader.getInstance().displayImage("json://" + googleUrl, imageAware);