簡體   English   中英

在AsyncTask的doInBackground()方法中運行FileOutputStream操作無法成功執行

[英]Running FileOutputStream operations in AsyncTask's doInBackground() method does not execute successfully

我正在使用AsyncTask作為內部類來保存位圖。 但是FileOutputStream操作不起作用。 如果在UI線程的方法中運行相同的代碼,則代碼將運行,並且我能夠成功保存位圖。

我知道doInBackground()方法確實可以執行,並且onPostExecute()方法也可以執行。

另外,如果我采用傳遞到AsyncTask的輸入流,並嘗試對其進行解碼以設置imageView,則它將不起作用。 但是,如果我在AsyncTask之外使用相同的代碼,它將起作用。

我按以下方式實現了AsyncTask,並且第二條和第三條日志語句未得到記錄,因此我知道某些程序無法正常運行:

public class SaveImageToInternalStorage extends AsyncTask {

    InputStream bitmap;
    String PICTURE_KEY;

    public SaveImageToInternalStorage1(final InputStream bitmap, final String PICTURE_KEY) {
        this.bitmap = bitmap;
        this.PICTURE_KEY = PICTURE_KEY;



      }


        @Override
        protected Object doInBackground(Object[] params) {
            FileOutputStream fos;
            try {

                fos =  picture_chooser.this.openFileOutput(PICTURE_KEY, MODE_PRIVATE);

              Bitmap bitmap2 = BitmapFactory.decodeStream(bitmap);
                Log.v("saveBitmap", " first log statement");  ////This gets logged
                bitmap2.compress(Bitmap.CompressFormat.WEBP, 85, fos);
                 Log.v("saveBitmap", " second log statement");  // This is not logged
                fos.close();

              Log.v("saveBitmap", " third log statement"); // This is not logged
            } catch (Exception e) {
                Log.e("saveToInternalStorage()", e.getMessage());

            }

            return null;
        }


        @Override
        protected void onPostExecute(Object o) {
            super.onPostExecute(o);
   Log.v("saveBitmap", " onPostExecute log statement");  // This is logged
            imageViewSetter(bitmap);

        }
    }


    //runs in the wrapper class 
      public void imageViewSetter(InputStream inputStream) {
            imageView.setImageBitmap(BitmapFactory.decodeStream(inputStream)); //this does not set the imageView 

        }

任何幫助將不勝感激。

看看這個例子從Android參考這里

我在下面為您重新創建了代碼

 private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
 protected Long doInBackground(URL... urls) {
     int count = urls.length;
     long totalSize = 0;
     for (int i = 0; i < count; i++) {
         totalSize += Downloader.downloadFile(urls[i]);
         publishProgress((int) ((i / (float) count) * 100));
         // Escape early if cancel() is called
         if (isCancelled()) break;
     }
     return totalSize;
 }

 protected void onProgressUpdate(Integer... progress) {
     setProgressPercent(progress[0]);
 }

 protected void onPostExecute(Long result) {
     showDialog("Downloaded " + result + " bytes");
 }
}

注意頂部的類聲明后跟

<URL, Integer, Long> 

接下來,查看該類內部的三個重寫方法。 您會注意到URL指向傳遞給doInBackground的參數,Integer是onProgressUpdate輸出的內容,而Long是doInBackground方法返回給onPostExecute

從中您可以希望看到AsyncTask應該如下使用

doInBackground傳入您想要執行的任何操作。 此方法在后台線程上完成您想要的工作。 此方法需要將完成的對象返回到onPostExecute ,在這里您可以捕獲已完成工作的結果並根據需要更新UI。 onProgressUpdate是可選的,您無需在此處做任何事情。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM