Implement uncaught exception handling mechanism
git-svn-id: https://osmand.googlecode.com/svn/trunk@91 e29c36b1-1cfa-d876-8d93-3434fc2bb7b8
This commit is contained in:
parent
8555ac76ee
commit
dc7521cde5
2 changed files with 102 additions and 20 deletions
|
@ -11,7 +11,7 @@ public class ToDoConstants {
|
||||||
* Write activity to show something about authors / donation ....
|
* Write activity to show something about authors / donation ....
|
||||||
*/
|
*/
|
||||||
public int DESCRIBE_ABOUT_AUTHORS = 8;
|
public int DESCRIBE_ABOUT_AUTHORS = 8;
|
||||||
|
|
||||||
// TODO ANDROID
|
// TODO ANDROID
|
||||||
// 25. POI search near to map location (show categories & type). Second cut. (implement incremental search)
|
// 25. POI search near to map location (show categories & type). Second cut. (implement incremental search)
|
||||||
|
|
||||||
|
@ -21,13 +21,12 @@ public class ToDoConstants {
|
||||||
|
|
||||||
// 24. Implement ResourceManager, load cities/streets/buildings on Low memory (clear previous all addresses cities).
|
// 24. Implement ResourceManager, load cities/streets/buildings on Low memory (clear previous all addresses cities).
|
||||||
// 5. Search for city/streets/buildings
|
// 5. Search for city/streets/buildings
|
||||||
// 9. Configure file log & see log from file (when exception happened to see from device)
|
|
||||||
// 15. Investigate interruption of any long running operation & implement where it is needed
|
// 15. Investigate interruption of any long running operation & implement where it is needed
|
||||||
|
|
||||||
// 17. Enable go to location by specifying coordinates
|
// 17. Enable go to location by specifying coordinates
|
||||||
// 11. Print out additional info speed, altitude, number of satellites
|
// 11. Print out additional info speed, altitude, number of satellites
|
||||||
// 19. Show how map is rotated where north/south on map (do not consider compass)
|
// 19. Show how map is rotated where north/south on map (do not consider compass)
|
||||||
// 23. Implement moving point from center to bottom (for rotating map). (+)
|
// 23. Implement moving point from center to bottom (for rotating map)
|
||||||
|
|
||||||
// 21. Implement zooming tile (if tile doesn't exist local, we can zoom in previous tile).
|
// 21. Implement zooming tile (if tile doesn't exist local, we can zoom in previous tile).
|
||||||
|
|
||||||
|
@ -43,20 +42,23 @@ public class ToDoConstants {
|
||||||
// 3. Fix progress information (loading indices) for android version
|
// 3. Fix progress information (loading indices) for android version
|
||||||
// 4. Fix when POI selected & enable button backToLocation
|
// 4. Fix when POI selected & enable button backToLocation
|
||||||
// 5. Call ResourceManager.close when it is needed
|
// 5. Call ResourceManager.close when it is needed
|
||||||
// 6. Understand concept of application where to save/restore global setting
|
// 6. Understand concept of application where to save/restore global setting.
|
||||||
// (for example reset navigate to point, reset link map with location). It should be reset after user call exit.
|
// (for example reset navigate to point, reset link map with location). It should be reset after user call exit.
|
||||||
// 7. Implement search amenities by type (!).
|
// 7. Implement search amenities by type (!).
|
||||||
// Rewrite search activity in order to limit amenities not to all types.
|
// Rewrite search activity in order to limit amenities not to all types.
|
||||||
|
|
||||||
// TODO SWING:
|
// TODO SWING:
|
||||||
// 1. Download tiles without using dir tiles
|
// 1. Download tiles without using dir tiles
|
||||||
// 2. Configure file log & see log from file
|
// 2. Configure file log & see log from file (add uncaught exception handling)
|
||||||
// 5. Implement supress warning for duplicate id
|
// 5. Implement supress warning for duplicate id
|
||||||
|
// 6. Implement renaming/deleting street/building/city
|
||||||
|
// 7. Implement saving bundle of tiles in different folder
|
||||||
|
|
||||||
|
|
||||||
// DONE ANDROID :
|
// DONE ANDROID :
|
||||||
// 18. Implement go to point
|
// 18. Implement go to point
|
||||||
// 2. Showing compass on the map : use device compass if exists(?)
|
// 2. Showing compass on the map : use device compass if exists(?)
|
||||||
|
// 9. Configure file log & see log from file (when exception happened to see from device)
|
||||||
|
|
||||||
// DONE SWING
|
// DONE SWING
|
||||||
|
|
||||||
|
|
|
@ -1,30 +1,88 @@
|
||||||
package com.osmand.activities;
|
package com.osmand.activities;
|
||||||
|
|
||||||
|
import java.io.BufferedWriter;
|
||||||
|
import java.io.ByteArrayOutputStream;
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileWriter;
|
||||||
|
import java.io.PrintStream;
|
||||||
|
import java.lang.Thread.UncaughtExceptionHandler;
|
||||||
|
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
|
import android.app.AlertDialog;
|
||||||
import android.app.Notification;
|
import android.app.Notification;
|
||||||
import android.app.NotificationManager;
|
import android.app.NotificationManager;
|
||||||
import android.app.PendingIntent;
|
import android.app.PendingIntent;
|
||||||
import android.app.ProgressDialog;
|
import android.app.ProgressDialog;
|
||||||
|
import android.app.AlertDialog.Builder;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
|
import android.os.Environment;
|
||||||
|
import android.text.format.DateFormat;
|
||||||
|
import android.util.Log;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.Window;
|
import android.view.Window;
|
||||||
import android.view.View.OnClickListener;
|
import android.view.View.OnClickListener;
|
||||||
import android.widget.Button;
|
import android.widget.Button;
|
||||||
|
|
||||||
|
import com.osmand.LogUtil;
|
||||||
import com.osmand.ProgressDialogImplementation;
|
import com.osmand.ProgressDialogImplementation;
|
||||||
import com.osmand.R;
|
import com.osmand.R;
|
||||||
import com.osmand.ResourceManager;
|
import com.osmand.ResourceManager;
|
||||||
|
|
||||||
public class MainMenuActivity extends Activity {
|
public class MainMenuActivity extends Activity {
|
||||||
|
|
||||||
|
private static boolean applicationAlreadyStarted = false;
|
||||||
|
private static final String EXCEPTION_PATH = "/osmand/exception.log";
|
||||||
|
private static final String EXCEPTION_FILE_SIZE = "/osmand/exception.log";
|
||||||
|
|
||||||
private Button showMap;
|
private Button showMap;
|
||||||
private Button exitButton;
|
private Button exitButton;
|
||||||
private Button settingsButton;
|
private Button settingsButton;
|
||||||
private Button searchButton;
|
private Button searchButton;
|
||||||
private NotificationManager mNotificationManager;
|
private NotificationManager mNotificationManager;
|
||||||
private int APP_NOTIFICATION_ID;
|
private int APP_NOTIFICATION_ID;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public void startApplication(){
|
||||||
|
if(!applicationAlreadyStarted){
|
||||||
|
// TODO exception!!! has leaked window ?
|
||||||
|
final ProgressDialog dlg = ProgressDialog.show(this, "Loading data", "Reading indices...");
|
||||||
|
final ProgressDialogImplementation impl = new ProgressDialogImplementation(dlg);
|
||||||
|
new Thread("Reader indexes") {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
try {
|
||||||
|
ResourceManager.getResourceManager().indexingPoi(impl);
|
||||||
|
ResourceManager.getResourceManager().indexingAddresses(impl);
|
||||||
|
} finally {
|
||||||
|
dlg.dismiss();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}.start();
|
||||||
|
applicationAlreadyStarted = true;
|
||||||
|
Thread.setDefaultUncaughtExceptionHandler(new DefaultExceptionHandler());
|
||||||
|
|
||||||
|
long size = getPreferences(MODE_WORLD_READABLE).getLong(EXCEPTION_FILE_SIZE, 0);
|
||||||
|
File file = new File(Environment.getExternalStorageDirectory(), EXCEPTION_PATH);
|
||||||
|
if(file.exists() && file.length() > 0){
|
||||||
|
if(size != file.length()){
|
||||||
|
String msg = "Previous application run was crashed. Log file is in " + EXCEPTION_PATH +". ";
|
||||||
|
msg += "Please raise the issue and attach log file.";
|
||||||
|
Builder builder = new AlertDialog.Builder(MainMenuActivity.this);
|
||||||
|
builder.setMessage(msg).setNeutralButton("Close", null).show();
|
||||||
|
getPreferences(MODE_WORLD_READABLE).edit().putLong(EXCEPTION_FILE_SIZE, file.length()).commit();
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
if(size > 0){
|
||||||
|
getPreferences(MODE_WORLD_READABLE).edit().putLong(EXCEPTION_FILE_SIZE, 0).commit();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onCreate(Bundle savedInstanceState) {
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
|
@ -84,21 +142,43 @@ public class MainMenuActivity extends Activity {
|
||||||
MainMenuActivity.this.finish();
|
MainMenuActivity.this.finish();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
// TODO exception!!! has leaked window !
|
|
||||||
final ProgressDialog dlg = ProgressDialog.show(this, "Loading data", "Reading indices...");
|
startApplication();
|
||||||
final ProgressDialogImplementation impl = new ProgressDialogImplementation(dlg);
|
}
|
||||||
new Thread() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
private class DefaultExceptionHandler implements UncaughtExceptionHandler {
|
||||||
try {
|
|
||||||
ResourceManager.getResourceManager().indexingPoi(impl);
|
private UncaughtExceptionHandler defaultHandler;
|
||||||
ResourceManager.getResourceManager().indexingAddresses(impl);
|
|
||||||
} finally {
|
|
||||||
dlg.dismiss();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}.start();
|
|
||||||
|
|
||||||
|
public DefaultExceptionHandler(){
|
||||||
|
defaultHandler = Thread.getDefaultUncaughtExceptionHandler();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void uncaughtException(final Thread thread, final Throwable ex) {
|
||||||
|
File file = new File(Environment.getExternalStorageDirectory(), EXCEPTION_PATH);
|
||||||
|
try {
|
||||||
|
ByteArrayOutputStream out = new ByteArrayOutputStream();
|
||||||
|
PrintStream printStream = new PrintStream(out);
|
||||||
|
ex.printStackTrace(printStream);
|
||||||
|
StringBuilder msg = new StringBuilder();
|
||||||
|
msg.append("Exception occured in thread " + thread.toString() + " : ").
|
||||||
|
append(DateFormat.format("MMMM dd, yyyy h:mm:ss", System.currentTimeMillis())).append("\n").
|
||||||
|
append(new String(out.toByteArray()));
|
||||||
|
|
||||||
|
if(Environment.getExternalStorageDirectory().canRead()){
|
||||||
|
BufferedWriter writer = new BufferedWriter(new FileWriter(file, true));
|
||||||
|
writer.write(msg.toString());
|
||||||
|
writer.close();
|
||||||
|
}
|
||||||
|
defaultHandler.uncaughtException(thread, ex);
|
||||||
|
} catch (Exception e) {
|
||||||
|
// swallow all exceptions
|
||||||
|
Log.e(LogUtil.TAG, "Exception while handle other exception", e);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue