UncaughtExceptionHandler замораживает приложение после обнаружения ошибки - PullRequest
0 голосов
/ 18 декабря 2018

После того, как ошибка обнаружена в UncaughtExceptionHandler, приложение на какое-то время зависает и через некоторое время получает ответ, что приложение не отвечает -> Подождите или -> Закрыть.

Причина, по которой я использовал UncaughtExceptionHandler, - для приложениязаписать отчет о сбое в файл при возникновении сбоя.Авария записывается в файл.Приложение зависает после сбоя.Мне нужно отобразить либо пользовательское действие, которое отображает «извините за сбои ..» или обычное окно. К сожалению, приложение было закрыто.

Я планирую опубликовать файл как multipart, как только было написано падениев файл.После успешного размещения файла мне нужно удалить этот файл.Можно ли написать функцию для выполнения вышеуказанной публикации и вызвать эту функцию сразу после записи отчета о сбое в файл?

Код:

public class UncaughtException implements UncaughtExceptionHandler {

private Context context;
private static Context context1;

public UncaughtException(Context ctx) {
    context = ctx;
    context1 = ctx;
}

private StatFs getStatFs() {
    File path = Environment.getDataDirectory();
    return new StatFs(path.getPath());
}

@SuppressWarnings("deprecation")
private long getAvailableInternalMemorySize(StatFs stat) {
    long blockSize, availableBlocks;
    if (Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR2) {
        blockSize = stat.getBlockSizeLong();
        availableBlocks = stat.getAvailableBlocksLong();
    } else {
        blockSize = stat.getBlockSize();
        availableBlocks = stat.getAvailableBlocks();
    }
    return availableBlocks * blockSize;
}

@SuppressWarnings("deprecation")
private long getTotalInternalMemorySize(StatFs stat) {
    long blockSize, totalBlocks;
    if (Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR2) {
        blockSize = stat.getBlockSizeLong();
        totalBlocks = stat.getBlockCountLong();
    } else {
        blockSize = stat.getBlockSize();
        totalBlocks = stat.getBlockCount();
    }
    return totalBlocks * blockSize;
}

private void addInformation(StringBuilder message) {
    message.append("Locale: ").append(Locale.getDefault()).append('\n');
    try {
        PackageManager pm = context.getPackageManager();
        PackageInfo pi;
        pi = pm.getPackageInfo(context.getPackageName(), 0);
        message.append("Version: ").append(pi.versionName).append('\n');
        message.append("Package: ").append(pi.packageName).append('\n');
    } catch (Exception e) {
        Log.e("CustomExceptionHandler", "Error", e);
        message.append("Could not get Version information for ").append(
                context.getPackageName());
    }
    message.append("Phone Model ").append(android.os.Build.MODEL)
            .append('\n');
    message.append("Android Version : ")
            .append(android.os.Build.VERSION.RELEASE).append('\n');
    message.append("Board: ").append(android.os.Build.BOARD).append('\n');
    message.append("Brand: ").append(android.os.Build.BRAND).append('\n');
    message.append("Device: ").append(android.os.Build.DEVICE).append('\n');
    message.append("Host: ").append(android.os.Build.HOST).append('\n');
    message.append("ID: ").append(android.os.Build.ID).append('\n');
    message.append("Model: ").append(android.os.Build.MODEL).append('\n');
    message.append("Product: ").append(android.os.Build.PRODUCT)
            .append('\n');
    message.append("Type: ").append(android.os.Build.TYPE).append('\n');
    StatFs stat = getStatFs();
    message.append("Total Internal memory: ")
            .append(getTotalInternalMemorySize(stat)).append('\n');
    message.append("Available Internal memory: ")
            .append(getAvailableInternalMemorySize(stat)).append('\n');
}

public void uncaughtException(Thread t, Throwable e) {
    try {
        StringBuilder report = new StringBuilder();
        Date curDate = new Date();
        report.append("Error Report collected on : ")
                .append(curDate.toString()).append('\n').append('\n');
        report.append("Informations :").append('\n');
        addInformation(report);
        report.append('\n').append('\n');
        report.append("Stack:\n");
        final Writer result = new StringWriter();
        final PrintWriter printWriter = new PrintWriter(result);
        e.printStackTrace(printWriter);
        report.append(result.toString());
        printWriter.close();
        report.append('\n');
        report.append("**** End of current Report ***");
        Log.e(UncaughtException.class.getName(), "Error while sendErrorMail" + report);

        //sendErrorMail(report);
        writeToFile(report.toString());
        Intent intent = new Intent(context, MainActivity.class);
        context.startActivity(intent);
    } catch (Throwable ignore) {
        Log.e(UncaughtException.class.getName(),
                "Error while sending error e-mail", ignore);
    }
}

private void writeToFile(String currentStacktrace) {
    try {
        //Gets the Android external storage directory & Create new folder Crash_Reports
        File dir = new File(Environment.getExternalStorageDirectory(), "Crash_Reports");
        if (!dir.exists()) {
            dir.mkdirs();
        }
        File file = new File(dir, "Crash_To_Be_Send");
        PrintWriter out = null;
        if (file.exists() && !file.isDirectory()) {
            out = new PrintWriter(new FileOutputStream(file, true));
        } else {
            //file.createNewFile();
            out = new PrintWriter(file);
        }
        out.append(currentStacktrace);
        out.close();
    } catch (Exception e) {
        Log.e("ExceptionHandler", e.getMessage());
    }
    //Can i call the below function to post the file and delete the file once posted ?
    //postFileToServerAndDeleteFileOncePosted()
}

}

Код класса приложения:

public void onCreate() {
    super.onCreate();
    Thread.setDefaultUncaughtExceptionHandler(new UncaughtException(this));
}

Может кто-нибудь указать, как я могу решить эту проблему?Никаких сторонних отчетов о сбоях не требуется (я уже использую Fabric-Crashlytics в других проектах)

...