2013-03-07 68 views
-1

编辑:我解决了这个更新UIL库为1.8.0,因为从早期版本中没有提供资产文件夹中添加图像的功能。我确实想念那个。从可绘制或资产文件夹触发器加载图像java.lang.NullPointerException

我在ListView使用Universal Image Loader

如果图像中不存在显示图像的列表,我想从任一被拉伸或该资产文件夹加载占位符。

在库文档此接受URI:

String imageUri = "assets://image.png"; // from assets 
String imageUri = "drawable://" + R.drawable.image; // from drawables 

但使用任何一种选择都会触发java.lang.NullPointerException

这里是我的onResume方法,其中我打开我的图片:

@Override 
public void onResume() { 
    super.onResume(); 

    //open connection to db 
    db = new DBAdapter(this); 
    db.open(); 

    // get all defects for this unit 
    defectList = db.getAllDefectsByUnit(unit_id); 
    // create an array adapter and let it to display our row 
    defects = new SimpleCursorAdapter(this, R.layout.defect_row, defectList, new String[] { "defect", "image_path" }, new int[] { R.id.defect, R.id.image }, 0); 

    //set custom view using ViewBinder 
    SimpleCursorAdapter.ViewBinder binder = new SimpleCursorAdapter.ViewBinder() { 
     @Override 
     public boolean setViewValue(View view, Cursor cursor, int columnIndex) { 

      //int placeholder_id = getResources().getIdentifier("placeholder", "drawable", getPackageName()); 

      //get column name 
      String name = cursor.getColumnName(columnIndex); 

      //for the thumbnail column,if we have an image replace the placeholder 
      if ("image_path".equals(name)) { 

       ImageView image = (ImageView) view.findViewById(R.id.image); 
       //Bitmap thumbnail; 
       String image_path = cursor.getString(columnIndex); 

       Log.i("image_path ->", image_path); 

       if (!image_path.equalsIgnoreCase("")) { 

        // Load and display image asynchronously 
        imageLoader.displayImage(file_prefix + image_path, image); 

       } else { 

        String imageUri = "drawable://" + R.drawable.placeholder; // drawable 
        //image.setImageResource(placeholder_id); 

        // Load and display image asynchronously 
        imageLoader.displayImage(imageUri, image); 

       } 

       return true; 

      } 

      //for the defect column, just add the text to the view 
      if ("defect".equals(name)) { 

       String defect_text = cursor.getString(columnIndex); 

       TextView defect_holder = (TextView) view.findViewById(R.id.defect); 
       defect_holder.setText(defect_text); 

       return true; 
      } 

      return false; 
     } 
    }; 

    defects.setViewBinder(binder); 

    setListAdapter(defects); 

}//onResume 

从文件加载没问题。

如果我尝试使用通用的Android方法加载占位符图像:

int placeholder_id = getResources().getIdentifier("placeholder", "drawable", getPackageName()); 
image.setImageResource(placeholder_id); 

然后加载图像精细(即使我有另外一个问题提到的here

下面是日志:

`03-07 15:58:07.141: E/ImageLoader(22950): null 
03-07 15:58:07.141: E/ImageLoader(22950): java.lang.NullPointerException 
03-07 15:58:07.141: E/ImageLoader(22950): at com.nostra13.universalimageloader.core.ImageDecoder.computeImageScale(ImageDecoder.java:121) 
03-07 15:58:07.141: E/ImageLoader(22950): at com.nostra13.universalimageloader.core.ImageDecoder.getBitmapOptionsForImageDecoding(ImageDecoder.java:104) 
03-07 15:58:07.141: E/ImageLoader(22950): at com.nostra13.universalimageloader.core.ImageDecoder.decode(ImageDecoder.java:82) 
03-07 15:58:07.141: E/ImageLoader(22950): at com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.decodeWithOOMHandling(LoadAndDisplayImageTask.java:252) 
03-07 15:58:07.141: E/ImageLoader(22950): at com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.decodeImage(LoadAndDisplayImageTask.java:235) 
03-07 15:58:07.141: E/ImageLoader(22950): at com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.tryLoadBitmap(LoadAndDisplayImageTask.java:211) 
03-07 15:58:07.141: E/ImageLoader(22950): at com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.run(LoadAndDisplayImageTask.java:128) 
03-07 15:58:07.141: E/ImageLoader(22950): at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:442) 
03-07 15:58:07.141: E/ImageLoader(22950): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
03-07 15:58:07.141: E/ImageLoader(22950): at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
03-07 15:58:07.141: E/ImageLoader(22950): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
03-07 15:58:07.141: E/ImageLoader(22950): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
03-07 15:58:07.141: E/ImageLoader(22950): at java.lang.Thread.run(Thread.java:856)` 

我在想什么?我是否传递格式不正确的URI?

+0

什么版本的lib?什么是'file_prefix'? – NOSTRA 2013-03-07 19:30:37

+0

我使用的是1.7.0,我刚刚通过更改日志,并且我使用的功能自1.8.0以来已添加:( – Mirko 2013-03-08 11:42:52

+0

file_prefix是'private String file_prefix =“file://”;' – Mirko 2013-03-08 11:44:37

回答

5

UIL仅支持从版本1.8.0 content://assets://drawable://方案开箱。

+0

是啊..我的不好:D – Mirko 2013-03-08 17:41:45

+0

请看这个问题:http://stackoverflow.com/questions/18034576/images-not-loading-from-assets-folder-using-universal-image-loader – marienke 2013-08-03 15:57:12

2

我猜你也检查一下,这里使用的URI

imageLoader.displayImage(file_prefix + image_path, image);

很好地形成。

我查看了库中的BaseImageDownloader类,其中检索资产文件的方法以及所有代码的顺序。以下是您的错误发生的地方。图像选项为空,表示图像路径不正确。

Options options = new Options(); 
    options.inJustDecodeBounds = true; 
    InputStream imageStream = imageDownloader.getStream(imageUri, displayOptions.getExtraForDownloader()); 
    try { 
     BitmapFactory.decodeStream(imageStream, null, options); 
    } finally { 
     IoUtils.closeSilently(imageStream); 
    } 

    int scale = 1; 
    int imageWidth = options.outWidth; //<-- this is where your error ocurrs 
    int imageHeight = options.outHeight; 

使用此代码进行测试,看看您是否得到相同的结果。这对我很有用,所以它也适用于你。如果不仔细检查你的文件名和你的路径。如果在发生错误之前无法找到发送给ImageDownloader的Uri的答案。

AssetManager mngr = getAssets(); 
    InputStream stream; 
    try { 
     stream = mngr.open("your_picture.png"); 

     BitmapFactory.Options o2 = new BitmapFactory.Options(); 
     o2.inSampleSize = 2;// If you want to scale 

     Bitmap bitmap = BitmapFactory.decodeStream(stream, new Rect(), o2); 

     ImageView image = (ImageView) view.findViewById(R.id.image); 
     image.setImageBitmap(bitmap); 

    } catch (IOException e) { 
     Log.e(TAG, "ERROR GETTING IMAGE", e); 
    } 
+0

我是一个白痴......从资源文件夹中加载图像的功能已添加到库的1.8.0版中,我使用的是1.7.0。我更新了图书馆,一切按预期工作。 – Mirko 2013-03-08 11:51:13

+0

我投票给你,因为我可能需要你在另一个项目中建议的代码;) – Mirko 2013-03-08 11:56:13

+0

谢谢米尔科。很高兴你来对了。 – Neil 2013-03-08 12:28:01

相关问题