Android:'threadid = 3:执行长任务时对信号3做出反应

Posted

技术标签:

【中文标题】Android:\'threadid = 3:执行长任务时对信号3做出反应【英文标题】:Android: 'threadid=3: reacting to signal 3' when executing long taskAndroid:'threadid = 3:执行长任务时对信号3做出反应 【发布时间】:2017-05-25 00:34:49 【问题描述】:

我正在我的应用程序中使用Runtime.getRuntime().exec(cmd) 执行命令。由于完成执行需要很长时间(几分钟),我把它放在一个线程中。但是使用线程方法,应用程序也会中途暂停,我看到这条消息:

threadid=3: reacting to signal 3
Wrote stack traces to '/data/anr/traces.txt'

以下是我正在使用的代码:

Thread thread = new Thread() 
        public void run()                 
            Process process = Runtime.getRuntime().exec(cmd);
            //cmd : command to be executed
            process.waitFor();

        
    ;
    thread.start();
    thread.join();

我在这里缺少什么?如何防止我的应用因处理时间过长而被暂停?

注意:我知道还有其他方法,例如 AsyncTask 等,但我认为在这种情况下不会有任何不同。 (或者会吗?)

【问题讨论】:

您的应用程序导致此代码出现 ANR:thread.join()。该调用导致当前线程在继续之前等待另一个线程死亡。如果这在主线程上调用,而另一个线程需要超过 5 秒才能继续,这将导致 ANR。根据您要执行的操作,最好不要在线程上调用join,并在线程即将完成时调用观察者 @0xDEADC0DE 你能指点我一些资源来了解如何“打电话给观察者”吗?我需要执行几个这样的命令,并且只有在当前命令完成后才能执行下一个命令。 你可以看看这个问题:***.com/questions/994840/… @0xDEADC0DE 非常感谢!有了您的意见,我现在可以解决问题了 @0xDEADC0DE 您能否发表您的建议作为答案。我会将其标记为已接受。 【参考方案1】:

您的应用在此行导致 ANR:thread.join()。该调用导致当前线程在继续之前等待另一个线程死亡。如果这在主线程上调用,而另一个线程需要超过 5 秒才能继续,这将导致 ANR。根据您要执行的操作,最好不要在线程上调用 join,并在线程即将结束时调用观察者。

如何实现观察者的例子,请看http://***.com/questions/994840/how-to-create-our-own-listener-interface-in-android

【讨论】:

以上是关于Android:'threadid = 3:执行长任务时对信号3做出反应的主要内容,如果未能解决你的问题,请参考以下文章

C语言中sleep函数的原理是啥?

threadid=1: thread exiting with uncaught exception (group=0x40fca9a8)的问题

Google gmail 列表 API 仅返回 id 和 threadId,根据文档,我没有在消息中收到有效负载

Android 问题汇总列表数组越界的问题

如何在android中打开特定的短信

Embarcadero XE5 中的 Android NFC