После того, как ошибка обнаружена в 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 в других проектах)