Folks,wzorzec projektowy do połowu nieobsłużonych wyjątków w AsyncTask
złapię nieobsłużonych wyjątków systemu Android za pomocą fragmentu kodu jak ten, na szczycie onCreate:
try {
File crashLogDirectory = new File(Environment.getExternalStorageDirectory().getCanonicalPath() + Constants.CrashLogDirectory);
crashLogDirectory.mkdirs();
Thread.setDefaultUncaughtExceptionHandler(new RemoteUploadExceptionHandler(
this, crashLogDirectory.getCanonicalPath()));
} catch (Exception e) {
if (MyActivity.WARN) Log.e(ScruffActivity.TAG, "Exception setting up exception handler! " + e.toString());
}
Chciałbym wymyślić coś podobnego do około dwóch tuzinów AsyncTasks, których używam w mojej aplikacji na Androida, więc nieobsługiwane wyjątki, które występują w doInBackground, zostają przechwycone & zarejestrowane.
Problem polega na tym, że AsyncTask przyjmuje inicjatory dowolnego typu, nie jestem pewien, jak zadeklarować nadklasę, z której dziedziczą wszystkie moje funkcje AsyncTasks, która konfiguruje ten nieobsługiwany moduł obsługi wyjątku.
Czy ktoś może polecić dobry wzorzec projektowania do obsługi nieobsługiwanych wyjątków w metodzie doInBackground AsyncTask, która nie wymaga kopiowania i wklejania kodu takiego jak powyżej dla każdej nowej definicji AsyncTask?
Dzięki!
UPDATE
Oto wzorzec projektowy Kiedyś, po patrząc ściślej na source of AsyncTask
import java.io.File;
import android.content.Context;
import android.os.AsyncTask;
import android.os.Environment;
import android.util.Log;
public abstract class LoggingAsyncTask<Params, Progress, Result> extends AsyncTask<Params, Progress, Result> {
protected void setupUnhandledExceptionLogging(Context context) {
try {
File crashLogDirectory = new File(Environment.getExternalStorageDirectory().getCanonicalPath() + Constants.CrashLogDirectory);
crashLogDirectory.mkdirs();
Thread.setDefaultUncaughtExceptionHandler(new RemoteUploadExceptionHandler(
context, crashLogDirectory.getCanonicalPath()));
} catch (Exception e) {
if (MyActivity.WARN) Log.e(ScruffActivity.TAG, "Exception setting up exception handler! " + e.toString());
}
}
}
potem określić swoje zadania w następujący sposób:
private class MyTask extends LoggingAsyncTask<Void, Void, HashMap<String, Object>> {
protected HashMap<String, Object> doInBackground(Void... args) {
this.setupUnhandledExceptionLogging(MyActivity.this.mContext);
// do work
return myHashMap;
}
}
Oczywiście TWOJEJ Zadanie może wykonać wszelkie niezbędne parametry z tym wzorcem. To Ty definiujesz RemoteUploadExceptionHandler, aby wykonać niezbędne rejestrowanie/przesyłanie.
mam akceptowane we wszystkich sprawach, dla których czułem, że był dobrym rozwiązaniem ... – esilver