![](/img/trans.png)
[英]AsyncTask onPost Execute is running but doInBackground is not
[英]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.