解析json数据并获取URL的图像以实现延迟加载

时间:2013-04-19 08:07:23

标签: java android rest httpclient lazy-loading

我想在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下载图片。
  3. 我的意思是我连接两次REST。我也使用Handler这可能不是一个好选择,但实际上我用AsyncTask进行了测试,我遇到了同样的问题。

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

    附录

    当我在列表中滚动速度非常快时,我发现图像加载不正确,否则就可以了。

3 个答案:

答案 0 :(得分:0)

使用here中的UniversalImageLoader库。它几乎没有错误。内存处理,线程和所有其他内容。

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

答案 1 :(得分:0)

哦,小伙子!每次下载图像时都要设置列表适配器。我建议你使用orroids教程使用列表视图,然后使用延迟图像加载listview。

列表视图

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

图像处理

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

答案 2 :(得分:0)

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

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;
        }
    }
});