1

У меня есть класс (назовем его ABC), который выполняет ввод-вывод. Некоторые вещи, такие как FileOutputStream.close, позволяют использовать блоки try catch вокруг них. Кроме того, я создал свои собственные объекты, которые помогают пользователю и мне знать, что происходит.Android Threads and Throwables

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

Итак, вот моя проблема. Мне нужно запустить этот класс из нового потока, но все же хочу получить информацию из текста throwable.

Так, например, это типичное предложение catch в моем классе.

new AlertDialog.Builder(myContext) 
         .setTitle("Error Message") 
         .setMessage(
           "Error Code: #006" + "\n" + T.toString()) 
         .setNeutralButton("OK", 
           new DialogInterface.OnClickListener() { 

            @Override 
            public void onClick(
              DialogInterface dialog, 
              int which) { 
             // TODO: Add Ability to Email 
             // Developer 

            } 
           }).show(); 

ли я просто сделать что-то вроде

throw new Throwable(throwable); 

этом внутри класса ABC вместо предупреждения диалога? Затем я переместил бы диалоговое окно предупреждения в try catch, где вызывается мой метод запуска интерфейса Runnable или выполняется в фоновом режиме для asynchtask?

ответ

2

Используйте Java Thread.UncaughtExceptionHandler, чтобы сохранить текст/отобразить диалог. Таким образом, вы бы сделать новый класс, расширяющий Thread.UncaughtExceptionHandler, как это:

public class myThreadExceptionHandler implements Thread.UncaughtExceptionHandler 
{ 
    private DataTargetClass dataTarget; 
    public myThreadExceptionHandler(DataTargetClass c) 
    { 
     dataTarget = c; 
    } 
    public void uncaughtException(Thread t, Throwable e) 
    { 
     dataTarget.exceptionObject = e; 
     dataTarget.onException(); 
     // Just substitute in whatever method your thread uses to return information. 
    } 
} 

В своем коде, который начал нить, вы могли бы сделать это:

foo = new DataTargetClass(); 
Thread t = new Thread(myIoRunnable(foo)); 
t.setUncaughtExceptionHandler(new myThreadExceptionHandler(foo)); 
t.start();