때때로 예외가보고되거나 기록되지 않고 갑자기 종료되는 활동이 있습니다. 활동이 갑자기 종료되고 앱이 스택의 이전 활동으로 돌아갑니다. ACRA (http://code.google.com/p/acra/)를 사용하여 오류를 캡처하고보고하며 앱의 다른 모든 오류에도 잘 작동하지만이 경우에는 예외가 발생하지 않았 음을 감지하지 못합니다. Logcat에보고 된 것도 없습니다.아무런 예외없이 갑작스럽게 종료되는 활동
사용자가 특정 조치를 취할 때 항상 앱의 동일한 "장소"에서 발생하지만 간헐적이며 아직 디버거와 연결되어있는 동안 문제가 발생하지 않았습니다. 활동에 어떤 일이 일어나고 있는지 결정하기위한 다른 옵션 (ACRA 및 Logcat 제외)이 있습니까? 아니면 안드로이드 활동 세계에서 "알려진"것입니까?
중요한 점이 있다면,이 액티비티는 비트 맵 조작 및 저장을 수행하고 있습니다. 나는 메모리 오류 가능성을 피하기 위해 조치를 취해야했다. OOM 예외가 발생했을 때 ACRA보고를 받고 있었으므로 이것이 OOME 때문일 것으로 생각하지 않습니다.
활동이 실패한 시점에서 활동은 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
어딘가에 활동을 마치시겠습니까? –
@nicholas finish()에 대한 부주의 한 호출을 두 번 확인하고 세 번 검사했습니다. 활동의 유일한 요소는 성공적인 완료 또는 기타 예상 조건입니다. –