当前位置: 首页 > 知识库问答 >
问题:

避免在运行时异常的情况下使处理程序线程崩溃?

高墨一
2023-03-14

我有一个发布Runnables的处理程序(线程)。如果Runnable错误地抛出RuntimeException,整个应用程序进程就会崩溃。作为默认情况,这听起来很明智,但我想捕获此类运行时异常,记录错误,然后继续运行。不过,我很难做到这一点。我想到了以下选项:

  1. 子类Looper并覆盖循环(),其中包含调用发布的Runnables的run()方法的代码。这不起作用,因为Looper是最终的。
  2. 子类HandlerThread并覆盖调用Looper.loop()的run方法。在运行时异常的情况下,再次调用super.run()等等。这不起作用,因为“每个线程只能创建一个Looper”。
  3. 在每个runnable类中,包含一个Runtime异常的try-catch。这会起作用,但很烦人,因为我有相当多不同的Runnable类。此外,如果可运行对象错误地忘记包含try-catch,则不会保护处理程序线程。

在理想情况下,Looper会有一个名为< code > registerExceptionHandler(exception handler)的成员方法,然后在出现异常时会调用< code>ExceptionHandler。

有人有更好的建议吗?

共有3个答案

柯苗宣
2023-03-14

最简单的方法似乎是从Runnable派生:

public abstract class RunnableBase implements Runnable
{
    public final void run()
    {
        try {
            runInternal();
        }
        catch(Exception e) {
            // handle the exception
        }
    }

    // to be implemented by concrete subclasses
    protected abstract void runInternal();
}
南门展
2023-03-14

在一个完美的世界里,默认例外处理程序在整个应用程序中对我来说就像一个魅力。如果它导致未处理的异常,它将触发。

这个库名为Android远程StackTrace。您只需要在应用程序类中注册这些DefaultHandlerException类的广播。

片段:

 public class Portfolio extends Application {
 static Portfolio portfolio;
 public void onCreate() {
    super.onCreate();
    portfolio = this;
    ExceptionHandler.register(portfolio);// registering for unhandled Exceptions
   }
 }

您可以使用这些执行各种任务,例如将日志堆栈跟踪上传到您的服务器或在应用程序崩溃时使用未处理的堆栈跟踪作为崩溃报告发送邮件。

凤凡
2023-03-14

尝试此自定义处理程序:

class H extends Handler {
    public H(Looper looper) {
        super(looper);
    }

    @Override
    public void dispatchMessage(Message msg) {
        // catch any Exception
        try {
            super.dispatchMessage(msg);
        } catch (Exception e) {
            Log.d(TAG, "dispatchMessage " + e.getMessage());
        }
    }
}

测试代码:

HandlerThread ht = new HandlerThread("hthread");
ht.start();
Handler h = new H(ht.getLooper());

Runnable r = new Runnable() {
    @Override
    public void run() {
        throw new RuntimeException("testing exception");
    }
};
h.post(r);
h.post(r);
 类似资料:
  • 问题内容: 我有以下情况。我的工作是: 在给定的时间后可能会超时,如果发生则需要抛出异常 如果没有超时,将返回结果 如果此作业返回结果,则必须尽快将其返回,因为性能非常重要。因此,异步解决方案已经不在市场上了,通过锤子自然捆绑系统也是一种选择。 最后,系统必须符合EJB标准,因此不建议使用普通线程的AFAIK,因为这是严格禁止的。 我们当前的解决方案使用一个线程,该线程在存在一定时间后将被抛出异常

  • 我正在使用的SMS网关来响应客户传入的短信。 但是,我的处理需要相当长的时间(大约20秒),在此期间,我从Twilio收到一个超时。 我在想一个防止超时的方法。我怎样才能加快处理时间?耗时最长的部分是我上传一些图像。我在想我可以在不同的线程中启动这个过程。我的服务器只有一个核心,那么多线程会有好处吗?

  • 问题内容: 在Java中,我们使用try catch块处理异常。我知道我可以像下面这样编写一个try catch块来捕获方法中抛出的任何异常。 但是Java中有什么方法可以让我在发生异常时获取一种称为的特定方法,而不是像上面的方法那样编写一个包罗万象的方法? 具体来说,当抛出异常(我的应用程序逻辑未处理)时,我想在Swing应用程序中显示一条用户友好的消息。 谢谢。 问题答案: 默认情况下,JVM

  • 1.1 异常处理的基本使用 try: <语句块1> except: <语句块2> try 捕获异常 except 发生异常时执行 try: <语句块1> except <异常类型名字>: <语句块2> except <异常类型名字> 发生对应异常时才会执行 1.2 异常处理的高级使用 try: <语句块1> except

  • 在上述情况下,如果用户为空,则给出NPE。如何避免NPE?

  • 问题内容: 我正在尝试使用其他EditText上传照片。我从一个在线示例中获取了示例代码,并对其进行了少量编辑,但我收到此错误: 我的Android代码: 请告诉我这里是什么问题,我该如何解决呢?预先感谢我知道,常见的答案是我需要从UI线程调用Toast.makeText(…):很抱歉,因为我很新任何人都介意对此进行更详细的解释 问题答案: 可能由于此行而出现错误 里面。必须显示在UIThread