2015-07-11 3 views
0

Я получаю это исключение аварии в моем Google Сбои & ANRS раздел для моего приложения java.lang.NullPointerException в android.util.LruCache.putjava.lang.NullPointerException в android.util.LruCache.put (Android)

Я понятия не имею, что не так. Мне нужна помощь, почему я действительно получаю это исключение нулевого указателя и как его исправить.

Сбои &: ANR:

java.lang.RuntimeException: An error occured while executing doInBackground() 
at android.os.AsyncTask$3.done(AsyncTask.java:300) 
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355) 
at java.util.concurrent.FutureTask.setException(FutureTask.java:222) 
at java.util.concurrent.FutureTask.run(FutureTask.java:242) 
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
at java.lang.Thread.run(Thread.java:841) 
Caused by: java.lang.NullPointerException: key == null || value == null 
at android.util.LruCache.put(LruCache.java:167) 
at 
com.b3du.im.GridAdapter.addBitmapToMemoryCache(GridAdapter.java:77) 
at com.b3du.im.GridAdapter$BitmapWorkerTaskVideo.doInBackground(GridAdapter.java:218) 
at com.b3du.im.GridAdapter$BitmapWorkerTaskVideo.doInBackground(GridAdapter.java:205) 
at android.os.AsyncTask$2.call(AsyncTask.java:288) 
at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
... 4 more 

Код:

public void addBitmapToMemoryCache(String key, Bitmap bitmap) { 
    if (getBitmapFromMemCache(key) == null) { 
     mMemoryCache.put(key, bitmap); 
    } 
} 

public Bitmap getBitmapFromMemCache(String key) { 
    return mMemoryCache.get(key); 
} 

class BitmapWorkerTaskVideo extends AsyncTask<String, Void, Bitmap> { 
    private final WeakReference<ImageView> imageViewReference; 

    public BitmapWorkerTaskVideo(ImageView imageView) { 
     // Use a WeakReference to ensure the ImageView can be garbage collected 
     imageViewReference = new WeakReference<ImageView>(imageView); 
    } 

    // Decode image in background. 
    @Override 
    protected Bitmap doInBackground(String... params) { 
     final Bitmap bitmap = decodeSnapshotFromFileVideo(params[0], 100, 100); 
     addBitmapToMemoryCache(String.valueOf(params[0]), bitmap); 
     return bitmap; 
    } 

    // Once complete, see if ImageView is still around and set bitmap. 
    @Override 
    protected void onPostExecute(Bitmap bitmap) { 
     if (imageViewReference != null && bitmap != null) { 
      final ImageView imageView = imageViewReference.get(); 
      if (imageView != null) { 
       imageView.setImageBitmap(bitmap); 
      } 
     } 
    } 

public Bitmap decodeSnapshotFromFileVideo (String filepath, int reqWidth, int reqHeight) { 

    //Create a file, using the filepath 
    File file = new File (filepath); 
    // First decode with inJustDecodeBounds=true to check dimensions 
    final BitmapFactory.Options options = new BitmapFactory.Options(); 
    options.inJustDecodeBounds = true; 
    ThumbnailUtils.createVideoThumbnail(file.getAbsolutePath(), MediaStore.Video.Thumbnails.MICRO_KIND); 
    // Calculate inSampleSize 
    options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight); 
    options.inJustDecodeBounds = false; 
    return ThumbnailUtils.createVideoThumbnail(file.getAbsolutePath(), MediaStore.Video.Thumbnails.MICRO_KIND); 

} 
+0

Похоже, что 'params [0]' может быть пустым. Кроме этого, не знаю, что делает этот код. – sstan

ответ

2
public static Bitmap createVideoThumbnail (String filePath, int kind) 

Создайте видеоролик для видео. Может вернуть null, если видео повреждено или формат не поддерживается.

Таким образом, может быть bitmap значение равно нулю. чтобы избежать этого Напишите свой код следующим образом:

if(bitmap != null) 
{ 
addBitmapToMemoryCache(String.valueOf(params[0]), bitmap); 
} 
+0

так в doInBackground() Мне просто нужно добавить (bitmap! = Null), как насчет того, если битмап равен нулю, что я должен вернуть? – boudi

+0

Если битмап равен null, он вернет значение null в onPostExecute, так как ваш doInBackground имеет тип «Bitmap». –

+0

Ваш ответ ясен, и вы решили мою проблему, спасибо – boudi

0

Это потому, что ThumbnailUtils.createVideoThumbnail() может возвращать нуль
Таким образом, вам нужно будет добавить флажок NPE для точечного рисунка в addBitmapToMemoryCache ()

Смежные вопросы