【问题标题】:Parse jsonData and get urlStrings for images in order to implement lazy loading解析json数据并获取图片的url字符串以实现延迟加载
【发布时间】:2013-04-19 08:07:22
【问题描述】:

我想在我的 ListView 中实现延迟加载图像。首先,我需要连接到一个 url 并获取属于一个对象的所有图像的 urlStrings。我得到一个 jsonString 然后解析:

String RESTUrl = new MasterdataDataProvider(mContext).getSyncServicePath() + "PhotoInfo/" + objectEntryID; 
List<String> urlStrings = new ArrayList<String>();
try {
    HttpGet httpGet = new HttpGet((RESTUrl + "/" + token));
    HttpParams httpParameters = new BasicHttpParams();
    DefaultHttpClient httpClient = new DefaultHttpClient(httpParameters);
    httpGet.addHeader("Accept", "application/json");
    httpGet.addHeader("Content-Type", "application/json");
    HttpResponse response = httpClient.execute(httpGet);
    String jsonData = EntityUtils.toString(response.getEntity());
    if (!jsonData.equals("[]")) {
        GsonPhotoInfo x = new GsonPhotoInfo(new GsonBuilder());
        PhotoInfo[] info = x.parseJSON(jsonData);
        for(PhotoInfo p : info) {
            System.out.println(p.getFileName());
            urlStrings.add(photoWebURL + objectDefID + "/" + objectEntryID + "/" + p.getFileName());
        }

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

正如您在这段代码中看到的,我获取了FileName from jsonData

然后我需要从 urlStrings 下载图片:

final Handler handler = new Handler() {
     @Override
     public void handleMessage(Message message) {
          ImagePagerAdapter adapter = new ImagePagerAdapter((Drawable[]) message.obj);
          viewPager.setAdapter(adapter); 
     }
};

     Thread thread = new Thread() {
     @Override
     public void run() {

         //PARSE THE JSON DATA and FETCH URLStrings (as you see in the piece of code at top)                       

         Drawable[] drawables = new Drawable[urlStrings.size()];
         for(int i=0; i< urlStrings.size(); i++) 
               drawables[i] = fetchDrawable(urlStrings.get(i));

               Message message = handler.obtainMessage(1, drawables);
               handler.sendMessage(message);
         }
    };
    thread.start();  

获取图片的代码取自James Wilson answer

你也可以看到,我必须再次使用 HTTPClient 来下载每张图片:

private InputStream fetch(String urlString) throws MalformedURLException, IOException {
    DefaultHttpClient httpClient = new DefaultHttpClient();
    HttpGet request = new HttpGet(urlString);
    HttpResponse response = httpClient.execute(request);
    return response.getEntity().getContent();
}

问题是它在我的 listView 中不起作用。 The images are not loaded correctly in listView sometimes,我只是想知道是不是因为这样:

  1. 我从 jsonData 获取 urlStrings,然后
  2. 从urlStrings中一张一张下载图片。

我的意思是我连接到 REST 两次。我也在使用Handler,这可能不是一个好的选择,但实际上我用AsyncTask 对其进行了测试,我遇到了同样的问题。

感谢任何可以解决我问题的想法。

附录:

当我在列表中快速滚动时发现图像加载不正确,否则很好。

【问题讨论】:

    标签: java android rest httpclient lazy-loading


    【解决方案1】:

    使用来自hereUniversalImageLoader 库。它几乎没有错误。内存处理、线程和所有其他东西。

    整合需要 2 分钟。试试看 !

    【讨论】:

    • 很高兴知道这一点,但我基本上想在我的代码中找到问题出在哪里的原因。
    • 你能分享你的 ImagePagerAdapter 代码吗?这里看起来不错!
    • 问题在于您的ImagePagerAdapter,因为适配器控制视图在屏幕上的显示方式。在快速滚动时,适配器可能不会实例化正确的元素,从而给出不正确的元素。尝试在ImagePagerAdapter 中查看instantiateItem() 方法
    【解决方案2】:

    天啊!!每次下载图像时,您都在设置列表适配器。我建议您使用 androids 教程来使用列表视图,然后使用延迟图像加载的列表视图。

    列表视图

    http://developer.android.com/training/improving-layouts/smooth-scrolling.html

    图像处理

    http://developer.android.com/training/displaying-bitmaps/load-bitmap.html

    【讨论】:

    • 代码在哪里?设置 viewPage 适配器与 ListView 适配器不同。对吗?
    • 你能说得清楚一点吗?你在哪里使用 ImagePagerAdapter?
    • 好的。所以你正在使用 ViewPager 来显示图像列表?如果是,那么我的回答仍然有效。在加载每个图像后,您正在为 viewpager 创建和设置适配器。
    • 我正在使用Thread。所以适配器会在图片下载后设置。如果您有更好的方法,请分享一些代码。 (正如我在问题中所说,每个对象都可以有几个图像。)
    【解决方案3】:

    我通过为我的 ListView 实现 OnScrollListener 解决了我的问题,并在滚动处于空闲模式时下载图像。但是我认为正确的方法是在延迟加载实现中不获取图片url,也许图片url需要包含在main Object中。

    public static boolean scroll_is_idle = true;
    
    mListView.setOnScrollListener(new OnScrollListener() {
        public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { }
    
        public void onScrollStateChanged(AbsListView view, int scrollState) {
            switch (scrollState) {
                    case OnScrollListener.SCROLL_STATE_IDLE:
                        scroll_is_idle = true;
                        mAdapter.notifyDataSetChanged();
                        break;
                    case OnScrollListener.SCROLL_STATE_TOUCH_SCROLL: 
                        scroll_is_idle = false;
                        break;
                    case OnScrollListener.SCROLL_STATE_FLING:
                        scroll_is_idle = false;
                        break;
            }
        }
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多