You're welcome.
One thing I should have mentioned. As you see I pass this thing called
EntryManager into the constructor. I meanwhile learned the lesson that there
can be a bug in the EntryManager creation too, which then cannot be reported
using the error reporter.

So next time I am working on it I will get the EntryManager lazily. I would
recommend the same to you, that is check everything for null or other
possible failures to prevent the error reporting causing an error ;-)

On Sat, Apr 11, 2009 at 5:55 PM, Mattaku Betsujin <
[email protected]> wrote:

> Wow, Mariano, this is great! Thanks a lot :-)
>
>
>
>
> On Sat, Apr 11, 2009 at 8:52 AM, Mariano Kamp <[email protected]>wrote:
>
>> Here is mine - no cleanup / enhancements, right from my repository. Really
>> basic stuff. And it doesn't work in the emulator as there is no email
>> activity.
>>
>> package com.newsrob;
>>
>>
>> import java.io.PrintWriter;
>>
>> import java.io.StringWriter;
>>
>> import java.lang.Thread.UncaughtExceptionHandler;
>>
>> import java.util.regex.Pattern;
>>
>>
>> import android.app.Application;
>>
>> import android.content.Intent;
>>
>> import android.os.Build;
>>
>> import android.util.Log;
>>
>>
>> public class NewsRob extends Application {
>>
>>
>>  private static final String TAG = NewsRob.class.getSimpleName();
>>
>> public static final boolean DEBUG = false;
>>
>>
>>  @Override
>>
>> public void onCreate() {
>>
>> super.onCreate();
>>
>> Log.d(TAG, "NewsRob.onCreate()");
>>
>> new NewsRobDefaultExceptionHandler(EntryManager.getInstance(NewsRob.this
>> ));
>>
>>
>>  }
>>
>>
>>  @Override
>>
>> public void onTerminate() {
>>
>> Log.d(TAG, "NewsRob.onTerminate()");
>>
>> super.onTerminate();
>>
>> }
>>
>>
>> }
>>
>>
>> class NewsRobDefaultExceptionHandler 
>> implementsThread.UncaughtExceptionHandler {
>>
>>
>>  private EntryManager entryManager;
>>
>> private UncaughtExceptionHandler oldDefaultExceptionHandler;
>>
>> private static final String TAG = NewsRobDefaultExceptionHandler.class
>> .getSimpleName();
>>
>>
>>  NewsRobDefaultExceptionHandler(EntryManager entryManager) {
>>
>> this.entryManager = entryManager;
>>
>> Log.d(TAG, "Default Exception Handler=" +
>> Thread.getDefaultUncaughtExceptionHandler());
>>
>> oldDefaultExceptionHandler = Thread.getDefaultUncaughtExceptionHandler();
>>
>>
>>  Thread.setDefaultUncaughtExceptionHandler(this);
>>
>>
>>  }
>>
>>
>>  public void uncaughtException(Thread t, Throwable e) {
>>
>> Log.e("NewsRob", "Caught the following exception: ", e);
>>
>> StringBuilder message = new StringBuilder(
>>
>> "Sorry!\n\nNewsRob hit a wall. Please send this mail, so that the
>> developer can analyze/fix the issue.\nIf it is not too much to ask, please
>> add to this mail what you just did:\n\n");
>>
>>
>>  message.append(String.format("-- NewsRob Version: %s/%s\n", entryManager
>> .getMyVersionName(),
>>
>> entryManager.getMyVersionCode()));
>>
>> message.append(String.format("-- Android Version: sdk=%s, release=%s,
>> inc=%s\n", Build.VERSION.SDK,
>>
>> Build.VERSION.RELEASE, Build.VERSION.INCREMENTAL));
>>
>> message.append(String.format("-- Thread State: %s\n", t.getState()));
>>
>>
>>  Job j = entryManager.getCurrentRunningJob();
>>
>> if (j != null)
>>
>> message.append(String.format("-- Job: %s\n", j.getJobDescription()));
>>
>>
>>  if (entryManager.runningThread != null)
>>
>> message.append(String.format("-- Running Thread: %s\n", entryManager.
>> runningThread));
>>
>>
>>  // Add stacktrace
>>
>> StringWriter sw = new StringWriter();
>>
>> PrintWriter pw = new PrintWriter(sw);
>>
>> e.printStackTrace(pw);
>>
>> pw.close();
>>
>> message.append("-- Stacktrace:\n");
>>
>> message.append(sw.getBuffer());
>>
>>
>>  String messageBody = message.toString();
>>
>>
>>  // ignore certain exceptions
>>
>> if (Pattern.compile("CacheManager.java:391").matcher(messageBody).find())
>>
>> return;
>>
>>
>>  // Prepare Mail
>>
>> final Intent sendIntent = new Intent(Intent.ACTION_SEND);
>>
>> sendIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
>>
>> sendIntent.setType("message/rfc822");
>>
>> sendIntent.putExtra(Intent.EXTRA_EMAIL, new String[] { "
>> [email protected]" });
>>
>> sendIntent.putExtra(Intent.EXTRA_SUBJECT, "BugReport: " +
>> e.getClass().getSimpleName() + ": "
>>
>> + e.getMessage());
>>
>> sendIntent.putExtra(Intent.EXTRA_TEXT, messageBody);
>>
>> Log.e(TAG, "Exception handled. Email activity should be initiated now.");
>>
>>
>>  // Send Mail
>>
>> new Thread(new Runnable() {
>>
>>
>>  public void run() {
>>
>> entryManager.getContext().startActivity(sendIntent);
>>
>> }
>>
>> }).start();
>>
>> Log.e(TAG, "Exception handled. Email should be sent by now.");
>>
>>
>>  // Use default exception mechanism
>>
>> if (oldDefaultExceptionHandler != null)
>>
>> oldDefaultExceptionHandler.uncaughtException(t, e);
>>
>> }
>>
>> }
>>
>>
>> On Sat, Apr 11, 2009 at 5:30 PM, Mattaku Betsujin <
>> [email protected]> wrote:
>>
>>> Hello Mike,
>>>
>>> Could you share how you implemented the bug report mechanism? How can you
>>> get a stack trace when the app crashes inside the UI thread?
>>>
>>> Thanks
>>>
>>>
>>> On Sat, Apr 11, 2009 at 6:51 AM, Mike Hearn <[email protected]>wrote:
>>>
>>>>
>>>> I really question what developers are doing to get so many F/C
>>>> comments (and I see them on other apps all the time).
>>>>
>>>> I have a crash/bug reporter integrated into my app. It's not a very
>>>> good one - it just uploads exception stacktraces and some data to my
>>>> server when the core logic code crashes, so it doesn't even cover UI
>>>> bugs.
>>>>
>>>> I have hundreds of reports from the wild (about 25k downloads). So
>>>> obviously my app does fail. Yet, the comments on the app are all
>>>> glowing, and people are remarkably willing to give 4 or 5 stars even
>>>> when it didn't do quite what they wanted. I really wonder about the
>>>> buggyness of apps that get significant numbers of F/C comments.
>>>>
>>>> It must be frustrating to see comments about bugs that you can't
>>>> reproduce, but at the same time, I think some people here believe
>>>> writing software is easy. It's hard. I did all kinds of testing with
>>>> my app, including disrupting its network connection at various points
>>>> as it runs, repeatedly sliding the screen to force activity
>>>> reconstruction etc. Some bugs still slipped through, fortunately the
>>>> crash reports identify them quite well as most people with problems
>>>> will never even leave a comment, let alone email you to help you
>>>> figure out the problem.
>>>>
>>>>
>>>>
>>>>
>>>
>>>
>>>
>>
>>
>>
>
> >
>

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Android Discuss" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/android-discuss?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to