2015-06-11 35 views
0

我在AsyncTaskdoInBackground()方法中獲取圖像的縮略圖。如果我使用cancel()取消AsyncTask,則運行AsyncTask時出現問題。我在logcat中遇到了一個奇怪的異常。該應用程序沒有終止,但logcat顯示異常消息。在AsyncTask中獲取圖像縮略圖的例外

我doInBackground()是象下面

protected Bitmap doInBackground(String... params) { 
     Bitmap bitmap = null; 
     String path = params[0]; 
     bitmap = getImageThumbnail(MainActivity.this,path); 
     //Some cache mechanism 
     return bitmap; 
    } 

getImageThumbnail方法

 public static Bitmap getImageThumbnail(Context context,String path) { 
      ContentResolver cr = context.getContentResolver(); 
      Cursor ca = cr.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, new String[]{MediaStore.MediaColumns._ID}, MediaStore.MediaColumns.DATA + "=?", new String[]{path}, null); 
      if (ca != null && ca.moveToFirst()) { 
       int id = ca.getInt(ca.getColumnIndex(MediaStore.MediaColumns._ID)); 
       ca.close(); 
       //At this line I am getting exception 
       Bitmap thumbnail = MediaStore.Images.Thumbnails.getThumbnail(cr, id, MediaStore.Images.Thumbnails.MICRO_KIND, null); 
       return thumbnail; 
      } 
      return ((BitmapDrawable) context.getResources().getDrawable(R.drawable.dummy)).getBitmap(); 
     } 

雖然異步任務是runnign狀態,如果我叫asyncTask.cancel(true)我收到以下消息in logcat

06-11 17:49:45.380 1600-1708/com.sample.appl V/MiniThumbFile﹕ Got exception checking file magic: 
    java.nio.channels.ClosedChannelException 
      at java.nio.FileChannelImpl.checkOpen(FileChannelImpl.java:73) 
      at java.nio.FileChannelImpl.lock(FileChannelImpl.java:161) 
      at android.media.MiniThumbFile.getMagic(MiniThumbFile.java:161) 
      at android.provider.MediaStore$InternalThumbnails.getThumbnail(MediaStore.java:635) 
      at android.provider.MediaStore$Images$Thumbnails.getThumbnail(MediaStore.java:1008) 
      at com.appsforbb.common.filesystem.ImageUtils.getImageThumbnail(ImageUtils.java:55) 
      at com.appsforbb.basic.filemanager.CacheImageView$BitmapWorkerTask.doInBackground(CacheImageView.java:79) 
      at com.appsforbb.basic.filemanager.CacheImageView$BitmapWorkerTask.doInBackground(CacheImageView.java:58) 
      at android.os.AsyncTask$2.call(AsyncTask.java:287) 
      at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
      at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
      at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 
      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
      at java.lang.Thread.run(Thread.java:856) 

如何避免這種異常?

+1

你爲什麼要做'ca.close();'兩次? –

+0

@MurtazaKhursheedHussain我刪除ca.close但仍然得到相同的結果! – Chandrakanth

回答

0

你正在創建位圖的縮略圖之前關閉光標,改變你的getImageThumbnail方法是這樣的:

public static Bitmap getImageThumbnail(Context context,String path) { 
      ContentResolver cr = context.getContentResolver(); 
      Cursor ca = null; 
      ca = cr.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, new String[]{MediaStore.MediaColumns._ID}, MediaStore.MediaColumns.DATA + "=?", new String[]{path}, null); 
      if (ca != null && ca.moveToFirst()) { 
       int id = ca.getInt(ca.getColumnIndex(MediaStore.MediaColumns._ID)); 

       //At this line I am getting exception 
       Bitmap thumbnail = MediaStore.Images.Thumbnails.getThumbnail(cr, id, MediaStore.Images.Thumbnails.MICRO_KIND, null); 
       ca.close(); 
       return thumbnail; 
      } 
      return ((BitmapDrawable) context.getResources().getDrawable(R.drawable.dummy)).getBitmap(); 
     } 
+0

仍然有同樣的問題! – Chandrakanth

+0

我認爲問題是關閉來通道或套接字。你可以請你發佈你的AsyncTask類嗎? – blueware

0

使用asyncTask.cancel(false)取消異步任務。然後,在撥打getImageThumbnail()之前,請在doInBackground()之前檢查isCancelled()

doInBackground()現在將是:

protected Bitmap doInBackground(String... params) { 
    Bitmap bitmap = null; 
    String path = params[0]; 
    if(!isCancelled()) { 
     bitmap = getImageThumbnail(MainActivity.this,path); 
     //Some cache mechanism 
    } 
    return bitmap; 
} 

你也應該在postExecute()做任何事情之前檢查isCancelled()

+0

它不工作,因爲問題是在線位圖= getImageThumbnail(MainActivity.this,路徑);在執行這一行時,我取消了異步任務 – Chandrakanth

+0

當您取消異步任務並將'false'傳遞給'AsyncTask.cancel()'時,是否出現了同樣的問題? – Thuo

+0

不,如果我調用AsyncTask.cancel(false)我不會得到這個例外,爲什麼,因爲如果異步任務已經開始,那麼如果調用cancel(false)它不會停止異步任務。 – Chandrakanth