我有一個活動有時會突然終止,但沒有任何異常被報告或記錄。該活動只是突然結束,應用程序返回到堆棧中的前一個活動。 我使用ACRA(http://code.google.com/p/acra/)來捕獲和報告錯誤,並且它適用於應用程序中的所有其他錯誤,但在這種情況下,它不會檢測到任何已拋出的異常。在Logcat中也沒有任何報道。活動終止突然沒有任何異常
它總是發生在應用程序中相同的「地點」,當用戶採取某個動作時,但它非常間歇,我還沒有在與調試器連接時發生。 除了ACRA和Logcat之外,還有其他選項可用於確定活動發生的情況嗎?或者這是Android活動的世界中的「已知?」
如果很重要,這個活動正在做位圖操作和保存;我必須採取措施避免潛在的內存不足錯誤;但是當ACRA發生OOM異常時,我得到了這些異常,因此我認爲這不是OOME引起的。
在似乎失敗的地方,Activity創建一個AsyncTask並執行它。下面是對的AsyncTask代碼(ActivityAsyncTask是一個非常簡單的超類; EditPhotoEctivity是垂死沒有例外的一個,有時在這個任務的創建或執行):
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.IOException;
import org.apache.commons.io.FileUtils;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.media.MediaScannerConnection;
import android.media.MediaScannerConnection.MediaScannerConnectionClient;
import android.net.Uri;
import android.view.View;
public class CompositeAndSavePictureTask extends ActivityAsyncTask<File, Void, Uri>
implements MediaScannerConnectionClient {
public static final String FILE_EXTENSION = ".jpg";
private static final int COMPRESSION_QUALITY = 100;
private File file;
private Uri mSavedImageUri;
private MediaScannerConnection mMediaScannerConnection;
public CompositeAndSavePictureTask(EditPhotoActivity owningActivity) {
super(owningActivity);
mMediaScannerConnection = new MediaScannerConnection(owningActivity, this);
}
@Override
protected EditPhotoActivity getOwner() {
return (EditPhotoActivity) super.getOwner();
}
@Override
protected void onPreExecute() {
getOwner().toggleControlsVisibility(false);
}
@Override
protected Uri doInBackground(File... params) {
file = params[0];
Bitmap picture = null;
View mainContentView = getMainContentView();
try {
picture = captureBitmap(mainContentView);
saveBitmap(picture);
} catch (Exception ex) {
LogUtils.logError(this, "Could not save photo", ex);
setError(ex);
return null;
} finally {
cleanUpCapture(mainContentView, picture);
}
try {
mMediaScannerConnection.connect();
synchronized (mMediaScannerConnection) {
mMediaScannerConnection.wait();
}
} catch (InterruptedException ex) {
LogUtils.logInfo(this, "MediaScannerConnection was interrupted during scan.");
setError(ex);
}
return mSavedImageUri;
}
protected Bitmap captureBitmap(View mainContentView) throws Exception {
mainContentView.setDrawingCacheEnabled(true);
return mainContentView.getDrawingCache();
}
protected void cleanUpCapture(View mainContentView, Bitmap capturedBitmap) {
mainContentView.setDrawingCacheEnabled(false);
if (capturedBitmap != null) {
capturedBitmap.recycle();
}
}
protected void saveBitmap(Bitmap bitmap) throws IOException {
BufferedOutputStream outStream = null;
try {
outStream = new BufferedOutputStream(FileUtils.openOutputStream(file));
bitmap.compress(CompressFormat.JPEG, COMPRESSION_QUALITY, outStream);
} finally {
try {
if (outStream != null) {
outStream.close();
}
} catch (IOException ex) {
LogUtils.logError(this, "Could not close output stream", ex);
}
}
}
@Override
protected void onPostExecute(Uri savedFileURI) {
getOwner().toggleControlsVisibility(true);
getOwner().onSaveResult(savedFileURI);
}
public void onMediaScannerConnected() {
mMediaScannerConnection.scanFile(file.getPath(), null /* mimeType */);
}
public void onScanCompleted(String path, Uri uri) {
mMediaScannerConnection.disconnect();
mSavedImageUri = uri;
synchronized (mMediaScannerConnection) {
mMediaScannerConnection.notify();
}
}
}
又見view.getDrawingCache() only works once,其中有有些關係,但情況稍有不同。
歡迎任何想法。
您能否提供一些源代碼?現在它會像蒙着眼睛的射擊一樣。 – Shade 2011-03-01 14:58:38
你能否在某處「完成」你的活動? – 2011-03-01 15:18:03
@nicholas我已經仔細檢查和三重檢查任何無意中調用完成()。活動中唯一的是成功完成或其他預期條件。 – 2011-03-01 15:38:34