我正在使用基于此question的延迟加载图片。我正在实现一个搜索功能,当用户输入关键字时,应用程序将执行请求并使用SAX解析结果,然后将数据放入ListView。有时,图像可以加载到ListView行的ImageViews中,但有时它只会加载一个或两个图像,应用程序崩溃。
以下是我的LogCat输出:
05-16 16:37:37.414: ERROR/AndroidRuntime(620): FATAL EXCEPTION: Thread-11
05-16 16:37:37.414: ERROR/AndroidRuntime(620): java.lang.NullPointerException
05-16 16:37:37.414: ERROR/AndroidRuntime(620): at com.TPLibrary.Search.ImageLoader.getBitmap(ImageLoader.java:71)
05-16 16:37:37.414: ERROR/AndroidRuntime(620): at com.TPLibrary.Search.ImageLoader.access$0(ImageLoader.java:68)
05-16 16:37:37.414: ERROR/AndroidRuntime(620): at com.TPLibrary.Search.ImageLoader$PhotosLoader.run(ImageLoader.java:173)
以下是发生错误的地方:
private Bitmap getBitmap(String url) { // line 68
//I identify images by hashcode. Not a perfect solution, but ok for the demo
String filename = String.valueOf(url.hashCode()); // line 71
File f = new File(cacheDir, filename);
//from SD cache
Bitmap b = decodeFile(f);
if (b != null)
return b;
//from web
try {
Bitmap bitmap = null;
InputStream is = new URL(url).openStream();
OutputStream os = new FileOutputStream(f);
Utils.CopyStream(is, os);
os.close();
bitmap = decodeFile(f);
return bitmap;
} catch (Exception ex){
ex.printStackTrace();
return null;
}
}
class PhotosLoader extends Thread {
public void run() {
try {
while(true)
{
//thread waits until there are any images to load in the queue
if (photosQueue.photosToLoad.size() == 0)
synchronized(photosQueue.photosToLoad) {
photosQueue.photosToLoad.wait();
}
if (photosQueue.photosToLoad.size() != 0) {
PhotoToLoad photoToLoad;
synchronized(photosQueue.photosToLoad) {
photoToLoad=photosQueue.photosToLoad.pop();
}
Bitmap bmp = getBitmap(photoToLoad.url); // line 173
cache.put(photoToLoad.url, bmp);
Object tag = photoToLoad.imageView.getTag();
if (tag != null && ((String)tag).equals(photoToLoad.url)){
BitmapDisplayer bd =
new BitmapDisplayer(bmp, photoToLoad.imageView);
Activity a = (Activity)photoToLoad.imageView.getContext();
a.runOnUiThread(bd);
}
}
if (Thread.interrupted())
break;
}
} catch (InterruptedException e) {
//allow thread to exit
}
}
}
修改
我已经跟踪了下面NullPointerException
课程中的PhotoToLoad
:
private class PhotoToLoad {
public String url;
public ImageView imageView;
public PhotoToLoad(String u, ImageView i) {
url = u;
imageView = i;
}
}
我该如何解决这个问题?
答案 0 :(得分:3)
您似乎已将null
传递给此方法。确保您正确处理null
,或确保您没有通过null
(首先更好;))。
中
String filename=String.valueOf(url.hashCode());
因此,此时url
为null
。所以要么整合像
if (url == null) {
Log.w("null has been passed to getBitmap()");
return null;
}
或者您可以查看将null
传递给此方法的每次调用,以使其崩溃。
答案 1 :(得分:0)
从catch()块中删除return null,因为这可能会抛出异常并且Bitmap会获得NULL对象。