Ленивая загрузка изображений работает только иногда, иногда нет - PullRequest
0 голосов
/ 16 мая 2011

Я использую ленивую загрузку изображений на основе этого вопроса .Я реализую функцию поиска, которая, когда пользователь вводит ключевое слово, приложение выполняет запрос и анализирует результат, используя SAX, а затем помещает данные в ListView.Иногда изображения могут быть загружены в ImageViews строк ListView, но иногда он загружает только одно или два изображения, и приложение вылетает.

Ниже приведен мой вывод 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
        }
    }
}

РЕДАКТИРОВАТЬ
Iвыследили NullPointerException из класса PhotoToLoad ниже:

private class PhotoToLoad {
    public String url;
    public ImageView imageView;
    public PhotoToLoad(String u, ImageView i) {
        url = u; 
        imageView = i;
    }
}

Как мне решить проблему?

Ответы [ 2 ]

3 голосов
/ 16 мая 2011

Кажется, что вы передаете null этому методу.Убедитесь, что вы правильно обрабатываете null, или не пропустите null (сначала лучше;)).Ваш журнал ошибок указывает, что NPE происходит в

String filename=String.valueOf(url.hashCode());

Итак, url равен null на данный момент.Так что либо вы интегрируете проверку, например

if (url == null) {
    Log.w("null has been passed to getBitmap()");
    return null;
}

, либо просматриваете каждый вызов, когда вы передаете null этому методу, что приводит к сбою.

0 голосов
/ 16 мая 2011

Удалите return null из вашего блока catch (), так как это может вызвать исключение и растровое изображение получает объект NULL.

...