首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android :合并JsonObjectRequest & ImageLoader,NullPointerException

Android :合并JsonObjectRequest & ImageLoader,NullPointerException
EN

Stack Overflow用户
提问于 2013-12-22 06:33:38
回答 1查看 798关注 0票数 1

我遇到一种情况,首先图片的网址应该从微博的API获得,然后,我想显示基于url的图片:

这里使用的是Volley,下面是我的代码:

代码语言:javascript
复制
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));

但是,当对最后一个句子使用一个NullPointerException时,我将得到一个weiboUrl:

代码语言:javascript
复制
     imageLoader.get(weiboUrl,ImageLoader.getImageListener(weiboAvatarMain,R.drawable.user, R.drawable.user));

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

有什么想法可以用来解决这个问题吗?

提前谢谢。

最好的

-更新

问题是我把

代码语言:javascript
复制
imageLoader.get(weiboUrl,ImageLoader.getImageListener(weiboAvatarMain,R.drawable.user, R.drawable.user));

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-12-22 08:38:09

代码语言:javascript
复制
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支持图像读取的缓存,我真的需要缓存读取的解决方案。

谢谢。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20726896

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档