2

您好,感谢您的帮助:

我想将 Java 系统移植到 Android,并且我想通过透明的独立服务将其提供给 3rd 方应用程序,因此它类似于系统库。该系统是一个 VoiceXML 解释器,它将解释由 3rd 方应用程序处理的文档并将结果发回给它。解释这些文件可能需要任意时间,甚至是很长的时间。

现在,我有一项服务可以创建完成所有工作的解释器。我在一个名为 startJVoiceXML() 的方法中执行此操作。

问题是我的服务在服务创建后大约 20 到 30 秒被 Android 杀死并出现 ANR。但是,如果我不在该方法上做任何繁重的工作(只是之前的代码),则服务将继续运行,并且不会在更长的时间内被杀死。

我需要创建一个线程来做我需要做的事情吗?我在代码中添加了一些注释以供进一步解释。

谢谢!

    public synchronized void startJVoiceXML(final URI uri) throws JVoiceXMLEvent, InterruptedException
    {
    AndroidConfiguration config = new AndroidConfiguration();
    jvxml = new JVoiceXmlMain(config);
    jvxml.addListener(this);
    jvxml.start();
    int a=0;

            //the wait is not the problem, the jvxml object run method calls jvxmlStarted in the service that does a .notifyAll() on this thread
    this.wait();    

            //this while is just to "do" some long running operation in order to emulate the Interpreter behaviour
    while(a<1000)
    {
        Thread.sleep(500);
        Log.e("JVoiceXML","esto en el while");
        a=a+1;
    }

    }

    public synchronized void jvxmlStarted() {
     this.notifyAll();
    }
4

1 回答 1

2

您应该在单独的线程中运行 CPU 密集型代码,如下所述:

服务在其宿主进程的主线程中运行——该服务不会创建自己的线程,也不会在单独的进程中运行(除非您另外指定)。这意味着,如果您的服务要执行任何 CPU 密集型工作或阻塞操作(例如 MP3 播放或网络),您应该在服务中创建一个新线程来完成这项工作。通过使用单独的线程,您将降低应用程序无响应 (ANR) 错误的风险,并且应用程序的主线程可以保持专用于用户与您的活动的交互。

于 2012-05-21T05:19:45.050 回答