我遇到的情况是首先应该从微博的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
本身不拥有缓存机制)
答案 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
支持图像读取缓存,我真的需要缓存读取的解决方案。
感谢。