Передовий досвід роботи з винятками Android?


77

Якщо моя програма виходить з ладу, вона зависає на пару секунд, перш ніж Android повідомляє, що програма аварійно завершила роботу та її потрібно закрити. Тож я думав зафіксувати всі винятки у своєму додатку загальним:

try {
    // ... 
} catch(Exception e) { 
    // ...
} 

І зробіть нову, Activityяка пояснює, що додаток миттєво зірвався (а також надає користувачам можливість надсилати повідомлення з деталями помилок), замість того, щоб затримувати цю затримку завдяки Android. Чи є кращі методи досягнення цього, чи це не рекомендується?

Оновлення: Я використовую Nexus 5 із увімкненою ART, і я не помічаю затримки, яка раніше спостерігалася при збої програм ("зависання", про яке я говорив спочатку). Думаю, оскільки зараз все є рідним кодом, збій відбувається миттєво разом із отриманням всієї інформації про збій. Можливо, Nexus 5 просто швидкий :) незалежно, це не може турбуватись у майбутніх випусках Android (враховуючи, що ART буде типовим середовищем виконання в Android L).



коли трапляється аварія, ваша активність руйнується, тож ви не можете самостійно впоратися з аварією.
Рагхундан

@Raghunandan так, але якщо збій трапляється через необроблений виняток, ви можете використовувати загальний обробник всіх винятків і запобігти його повному збою.
ldam

@LoganDam Ви коли-небудь щось розгадали?
theblang

@mattblang Я насправді вже давно не торкався своїх речей для Android, робота була шаленою. Невдовзі, можливо, знову повернеться у світ Android. Варіант CRUSADER виглядає як шлях із прочитаного мною.
ldam

Відповіді:


102

Тут перевірте посилання для довідки .

Тут ви створюєте клас, скажімо ExceptionHandler, що implements java.lang.Thread.UncaughtExceptionHandler..

Усередині цього класу ви будете робити свої рятувальні речі, такі як створення стека і підготовка до завантаження звіту про помилки тощо ....

Тепер настає важлива частина, тобто як зловити цей виняток. Хоча це дуже просто. Скопіюйте наступний рядок коду у кожному завданні відразу після виклику методу super у вашому 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);
    }
}

Сподіваюся, це допомагає ...


Ваш приклад діяльності не реалізується UncaughtExceptionHandler:) дякую за відповідь, спробую, коли повернусь додому з роботи.
ldam

Крім того, Thread.setDefaultUncaughtExceptionHandler()не слід вводити основну / першу діяльність, щоб вона обробляла всі винятки в додатку?
ldam

Я сказав, щоб створити клас, скажімо ExceptionHandler реалізує java.lang.Thread.UncaughtExceptionHandler .... А потім у своїй звичайній діяльності додайте вищезгаданий рядок коду ... Будь ласка, зверніться до згаданого вище посилання, щоб отримати ширше уявлення ..
CRUSADER

@CRUSADER Щиро дякую, що те посилання, яке ви згадали як посилання, працює чудово.
Ахмад Арслан,

8
Або просто додайте цей рядок один раз до BaseActivity і підкласуйте цю активність у всій програмі.
WKS

9

Ви можете просто використовувати загальне діалогове вікно попередження для швидкого відображення повідомлень про помилки. Наприклад...

//******************************************
//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();
}

Ви також можете додати до цього методу інші варіанти обробки помилок, наприклад, стек стека друку


ймовірно, вам слід обробити повідомлення про помилку перед тим, як показати його користувачам
гієна

4

я знайшов метод "wtf" (яка жахлива помилка) у класі Log. З опису:

Залежно від конфігурації системи, звіт може бути доданий до DropBoxManager та / або процес може бути негайно припинено діалоговим вікном про помилку.

http://developer.android.com/reference/android/util/Log.html

Сподіваюся, це комусь допомагає

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.