Android Volley:结合JsonObjectRequest& ImageLoader,NullPointerException

时间:2013-12-22 06:33:39

标签: android multithreading android-volley

我遇到的情况是首先应该从微博的API获取图片的网址,然后,我想根据网址显示图片:

这里使用了Volley Lib,这是我的代码:

JsonObjectRequest jsObjRequest = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() {
                @Override
                public void onResponse(JSONObject response) {
                    Log.i("Result", response.toString());
                    try {
                        String weiboNickName = response.getString("name");
                        weiboNameMain.setText(weiboNickName);

                        weiboUrl = response.getString("avatar_hd");

                        weiboUrl = weiboUrl.replace("\\", "");

                        Toast.makeText(MainPage.this, "url: " + weiboUrl, Toast.LENGTH_SHORT).show();                                                       imageLoader = new ImageLoader(queue, new BitmapLruCache(BitmapLruCache.getDefaultLruCacheSize()));

                    } catch (JSONException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }, new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                }
            });
            queue.add(jsObjRequest);
            imageLoader.get(weiboUrl,ImageLoader.getImageListener(weiboAvatarMain,R.drawable.user, R.drawable.user));

但是,当使用weiboUrl作为最后一个句子时,我会得到一个NullPointerException:

     imageLoader.get(weiboUrl,ImageLoader.getImageListener(weiboAvatarMain,R.drawable.user, R.drawable.user));

我知道这是因为Volley会创建另一个Thread,所以在请求中的Thread结束之前我不应该在主线程中使用引用。

是否有一些想法可以用来克服这个问题?

提前致谢。

最佳

---更新

问题在于我放

imageLoader.get(weiboUrl,ImageLoader.getImageListener(weiboAvatarMain,R.drawable.user, R.drawable.user));

处于错误的位置。如果我把它放在jsObject的onResponse()方法中,问题就会消失。然后可以使用图像缓存。 (ImageRequest本身不拥有缓存机制)

1 个答案:

答案 0 :(得分:0)

JsonObjectRequest jsObjRequest = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() {
                @Override
                public void onResponse(JSONObject response) {
                    Log.i("Result", response.toString());
                    try {
                        String weiboNickName = response.getString("name");
                        weiboNameMain.setText(weiboNickName);

                        weiboUrl = response.getString("avatar_hd");

                        weiboUrl = weiboUrl.replace("\\", "");


                        Response.Listener<Bitmap> listener = new Response.Listener<Bitmap>() {
                            @Override
                            public void onResponse(Bitmap bitmap) {
                                String weiboAvatar = ImageHandler.storeImage(bitmap, getRoot(), getWeiboAvatarName());

                                Log.i("store info", weiboAvatar);
                                Editor edit = preference.edit();
                                edit.putString("weiboAvatar", weiboAvatar);
                                edit.apply(); 

                                weiboAvatarMain.setImageBitmap(bitmap);
                            }
                        };

                        ImageRequest imgRequest = new ImageRequest(weiboUrl, listener, 0, 0, null, null);
                        queue.add(imgRequest);
                    } catch (JSONException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }, new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                }
            });
            queue.add(jsObjRequest);

我使用ImageRequest代替ImageLoader来克服这个问题,它有效。这里的场景是图像不会随时间变化,因此我将其保存到本地文件中。

然而,由于ImageLoader支持图像读取缓存,我真的需要缓存读取的解决方案。

感谢。