Сбой 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, чтобы отразить текущее состояние репозитория проекта, и все будет в порядке. Изучая различия для них, изменение в основном добавляет и обрабатывает нулевую проверку.