Лучшая практика обработки исключений для Android?
Если мое приложение выйдет из строя, оно зависает на пару секунд, прежде чем я расскажу Android о том, что приложение разбилось и ему нужно закрыть. Поэтому я думал о том, чтобы уловить все исключения в моем приложении с помощью генерала:
try {
// ...
} catch(Exception e) {
// ...
}
И создайте новый Activity
, который объяснит, что приложение мгновенно сработало (а также предоставило пользователям возможность отправлять почту с данными об ошибках) вместо того, чтобы задержать эту задержку благодаря Android. Есть ли лучшие методы достижения этого или это обескураживает?
Обновление: Я использую Nexus 5 с включенным АРТ, и я не замечаю задержку, с которой я столкнулся с сбоями приложений ( "зависание", о котором я говорил первоначально). Я думаю, так как теперь все есть собственный код, авария происходит мгновенно вместе с получением всей информации о сбоях. Возможно, Nexus 5 просто быстро:) несмотря на это, это может быть не беспокойство в будущих выпусках Android (учитывая, что ART будет исполняться по умолчанию в Android L).
Ответы
Ответ 1
Здесь проверьте ссылку для справки.
Здесь вы создаете класс: ExceptionHandler, который implements java.lang.Thread.UncaughtExceptionHandler
..
Внутри этого класса вы будете делать свои вещи, спасая жизнь, например, создавая stacktrace и gettin, готовые загрузить отчет об ошибках и т.д....
Теперь идет важная часть. То есть, как поймать это исключение.
Хотя это очень просто. Скопируйте следующую строку кода в каждую вашу активность сразу после вызова метода super в методе override onCreate
.
Thread.setDefaultUncaughtExceptionHandler(new ExceptionHandler(this));
Ваша активность может выглядеть примерно так...
public class ForceClose extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Thread.setDefaultUncaughtExceptionHandler(new ExceptionHandler(this));
setContentView(R.layout.main);
}
}
Надеюсь, что это поможет...
Ответ 2
Вы можете просто использовать общий предупреждающий диалог для быстрого отображения сообщений об ошибках.
Например...
//******************************************
//some generic method
//******************************************
private void doStuff()
{
try
{
//do some stuff here
}
catch(Exception e)
{
messageBox("doStuff", e.getMessage());
}
}
//*********************************************************
//generic dialog, takes in the method name and error message
//*********************************************************
private void messageBox(String method, String message)
{
Log.d("EXCEPTION: " + method, message);
AlertDialog.Builder messageBox = new AlertDialog.Builder(this);
messageBox.setTitle(method);
messageBox.setMessage(message);
messageBox.setCancelable(false);
messageBox.setNeutralButton("OK", null);
messageBox.show();
}
Вы также можете добавить другие методы обработки ошибок в этот метод, например, printtttrace
Ответ 3
я нашел метод "wtf" (какой ужасный отказ) в классе журнала. Из описания:
В зависимости от конфигурации системы отчет может быть добавлен к DropBoxManager и/или процесс могут быть немедленно прекращены диалог ошибок.
http://developer.android.com/reference/android/util/Log.html
Надеюсь, это поможет кому-то