Android-исключения без принудительного закрытия - PullRequest
0 голосов
/ 27 марта 2012

Я мог бы что-то упустить, но всякий раз, когда в Android (или java) возникает исключение, мое приложение ВСЕГДА закрывается принудительно, и вся программа завершается.Однако когда что-то идет не так, например, запрос к базе данных, я просто хочу вернуться в главное меню.

try {
        database.query(params);

} catch (Exception e) {
        Log.e("Game", "Failed Loading Level", e);
        returnToMenu();
    }

}

Это, например, force закрывает мою программу, я просто хочу, чтобы она продолжалась!

Ответы [ 3 ]

7 голосов
/ 13 сентября 2012

Все разработчики Android должны были столкнуться с проблемой принудительного закрытия при разработке приложения. Вот метод, чтобы поймать эту ошибку и обработать ее элегантно.

Это создаст механизм страниц с сообщениями об ошибках в вашем приложении для Android. Поэтому, когда ваше приложение падает, пользователь не сможет увидеть этот раздражающий всплывающий диалог. Вместо этого приложение будет отображать предопределенный вид для пользователя.

Чтобы создать такой механизм, нам нужно создать один обработчик ошибок и класс Activity, который будет получать представление при каждом принудительном закрытии приложения.

import java.io.*;

import android.content.*;
import android.os.Process;

public class ExceptionHandler implements java.lang.Thread.UncaughtExceptionHandler {
    private final Context myContext;

    public UncaughtExceptionHandler(Context context) {
        myContext = context;
    }

    public void uncaughtException(Thread thread, Throwable exception) {
        StringWriter stackTrace = new StringWriter();
        exception.printStackTrace(new PrintWriter(stackTrace));
        System.err.println(stackTrace);

        Intent intent = new Intent(myContext, CrashActivity.class);
        intent.putExtra(BugReportActivity.STACKTRACE, stackTrace.toString());
        myContext.startActivity(intent);

        Process.killProcess(Process.myPid());
        System.exit(10);
    }}

Вышеупомянутый класс будет работать как слушатель для ошибки принудительного закрытия. Вы можете видеть, что Intent и startActivity используются для запуска новой операции при сбое приложения. Поэтому он запускает действие с именем CrashActivity при каждом сбое приложения. На данный момент я передал трассировку стека в качестве дополнения к намерению.

Теперь, поскольку CrashActivity - это обычная Android Actitvity, вы можете обращаться с ней любым удобным для вас способом.

Теперь важная часть, т. Е. Как поймать это исключение. Хотя это очень просто. Скопируйте следующую строку кода в каждое действие сразу после вызова метода super в переопределенном методе onCreate.

Thread.setDefaultUncaughtExceptionHandler (новый UncaughtExceptionHandler (this));

Ваша деятельность может выглядеть примерно так ...

public class ForceClose extends Activity {

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler(this));

    setContentView(R.layout.main);

    // Your mechanism is ready now.. In this activity from anywhere if you get force close error it will be redirected to the CrashActivity.
}}

Вы можете скачать zip-файл по этой ссылке

http://trivedihardik.wordpress.com/2011/08/20/how-to-avoid-force-close-error-in-android/

0 голосов
/ 25 апреля 2019

У меня была похожая проблема, и я оказался на этой странице, потому что не мог понять, почему мое приложение не уловило исключение, которое я выбрасывал.Оказывается, это было по очевидной причине, поэтому я поделюсь.

В моем случае у меня был некоторый код, который получал данные JSON из запроса HTTPS.Это заставило компилятор скулить, и мне пришлось сделать попытку / поймать код, анализирующий JSON.Пока все хорошо.

JSON содержал, помимо прочего, строки версий в произвольном формате, и я хотел сравнить эту строку версии с версией прошивки на устройстве, к которому подключено приложение.Поэтому я создал класс, который берет строку версии и разбирает ее на различные компоненты, а затем использует их в определенном порядке для сравнения.В конструкторе, где я разбираю строку на компоненты, я выкидываю исключение, если строка недопустима.Опять же, это нормально и совершенно нормально.

Ребята, которые работают над прошивкой, говорят мне, что мое приложение вылетает.ОК - надо выяснить почему.Оказывается, они помещают неверную строку версии в прошивку.Хорошо - это нормальноЧто должно произойти, это то, что класс Version генерирует исключение, которое перехватывается моим try / catch, и просто предотвращает логику, связанную со сравнением версий, и не отображает доступное обновление прошивки, что нормально в этой (необычной) ситуации.

После того, как я поразмыслил, почему исключение не перехватывается, я наконец-то понял, что это потому, что мой try / catch перехватывает JSONException, тогда как мой класс Version генерирует RuntimeException.

Итакесли вы не можете понять, почему ваш try / catch не перехватывает исключение, вы думаете, что оно должно перехватить, и вы попадаете сюда, дважды проверьте, с каким типом исключения вы имеете дело, и убедитесь, что у вас есть подходящий тип для перехвата.

0 голосов
/ 10 декабря 2015

Если вы реализовали onSaveInstanceState () и onRestoreInstanceState (), вы можете заменить CrashActivity.class действием, вызвавшим сбой. Смотри http://developer.android.com/reference/android/app/Activity.html.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...