Сбой NetworkImageView

Мое приложение имеет активность с ListViewи для каждой ячейки в списке, мне нужно загрузить изображение из URL. Однако приложение вылетает, когда я добавляю строку для загрузки изображения.

Я не знаю, вызвана ли ошибка моим кодом или каким-либо поведением повторного использования ячеек представления списка, так как Logcat не указывает ни на одну строку в моем коде. Я убедился, что переданные URL верны и могут не мешать.

Я следовал этому руководству, чтобы написать этот код.

Вот ListView класс адаптера, куда я загружаю образ getView(...):

class CellAdapter extends BaseAdapter {

    Context context;
    List<Product> productList;
    private static LayoutInflater inflater = null;

    public CellAdapter(Context context, List<Product> productList) {
        this.context = context;
        this.productList = productList;
        inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    @Override
    public int getCount() {
        return productList.size();
    }

    @Override
    public Product getItem(int position) {
        return productList.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View view = convertView;
        while (view == null)
            view = inflater.inflate(R.layout.product_result, null);

        NetworkImageView image = (NetworkImageView) view.findViewById(R.id.cell_product_image);
        image.setDefaultImageResId(R.drawable.image_placeholder);
        image.setImageUrl(getItem(position).imageURL, APIManager.getSharedImageLoader());

        return view;
    }
}

ImageLoader использованное выше настраивается следующим образом:

sharedImageLoader = new ImageLoader(Volley.newRequestQueue(context), new BitmapLruCache());

И BitmapLruCache является:

public class BitmapLruCache extends LruCache<String, Bitmap> implements ImageLoader.ImageCache {

    public BitmapLruCache() {
        this(getDefaultLruCacheSize());
    }

    public BitmapLruCache(int sizeInKiloBytes) {
        super(sizeInKiloBytes);
    }

    @Override
    protected int sizeOf(String key, Bitmap value) {
        return value.getRowBytes() * value.getHeight() / 1024;
    }

    @Override
    public Bitmap getBitmap(String url) {
        return get(url);
    }

    @Override
    public void putBitmap(String url, Bitmap bitmap) {
        put(url, bitmap);
    }

    public static int getDefaultLruCacheSize() {
        final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);

        return maxMemory / 8;
    }
}

Это ошибка Logcat:

E/AndroidRuntime﹕ FATAL EXCEPTION: main
    java.lang.NullPointerException
            at com.android.volley.Request.<init>(Request.java:137)
            at com.android.volley.toolbox.ImageRequest.<init>(ImageRequest.java:71)
            at com.android.volley.toolbox.ImageLoader.get(ImageLoader.java:219)
            at com.android.volley.toolbox.NetworkImageView.loadImageIfNecessary(NetworkImageView.java:149)
            at com.android.volley.toolbox.NetworkImageView.onLayout(NetworkImageView.java:198)
            at android.view.View.layout(View.java:7175)
            at android.widget.RelativeLayout.onLayout(RelativeLayout.java:912)
            at android.view.View.layout(View.java:7175)
            at android.widget.ListView.setupChild(ListView.java:1833)
            at android.widget.ListView.makeAndAddView(ListView.java:1748)
            at android.widget.ListView.fillDown(ListView.java:670)
            at android.widget.ListView.fillFromTop(ListView.java:727)
            at android.widget.ListView.layoutChildren(ListView.java:1598)
            at android.widget.AbsListView.onLayout(AbsListView.java:1262)
            at android.view.View.layout(View.java:7175)
            at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1254)
            at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1130)
            at android.widget.LinearLayout.onLayout(LinearLayout.java:1047)
            at android.view.View.layout(View.java:7175)
            at android.widget.FrameLayout.onLayout(FrameLayout.java:343)
            at android.view.View.layout(View.java:7175)
            at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1254)
            at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1130)
            at android.widget.LinearLayout.onLayout(LinearLayout.java:1047)
            at android.view.View.layout(View.java:7175)
            at android.widget.FrameLayout.onLayout(FrameLayout.java:343)
            at android.view.View.layout(View.java:7175)
            at android.widget.FrameLayout.onLayout(FrameLayout.java:343)
            at android.view.View.layout(View.java:7175)
            at android.view.ViewRoot.performTraversals(ViewRoot.java:1140)
            at android.view.ViewRoot.handleMessage(ViewRoot.java:1859)
            at android.os.Handler.dispatchMessage(Handler.java:99)
            at android.os.Looper.loop(Looper.java:130)
            at android.app.ActivityThread.main(ActivityThread.java:3714)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:507)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:853)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:611)
            at dalvik.system.NativeStart.main(Native Method)

Вот метод, содержащий исключение нулевого указателя:

    public Request(int method, String url, Response.ErrorListener listener) {
        mMethod = method;
        mUrl = url;
        mErrorListener = listener;
        setRetryPolicy(new DefaultRetryPolicy());
        /* the next line is line 137 with the Exception */
        mDefaultTrafficStatsTag = TextUtils.isEmpty(url) ? 0: Uri.parse(url).getHost().hashCode(); 
    }

1 ответ

Решение

Вы используете устаревшую версию этой библиотеки, в которой отсутствуют следующие два последних коммита:

6c33917 Слияние "Защита от NullPointerException, в настоящее время возникающая в Volley, когда Запросу дается URL-адрес, хост которого является нулевым". Фикус Киркпатрик - 3 недели назад idea133-еженедельный выпуск мастера

0ec9297 Защита от NullPointerException, в настоящее время возникающего в Volley, когда Запросу дается URL-адрес, хост которого является нулевым. от kang - 3 недели назад

Обновите свою рабочую версию с помощью git, чтобы отразить текущее состояние репозитория проекта, и все будет в порядке. Изучая различия для них, изменение в основном добавляет и обрабатывает нулевую проверку.

Другие вопросы по тегам