如何在独立的Android服务中避免ANR

时间:2012-05-21 03:49:19

标签: android service

您好,感谢您的帮助:

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

现在我有一项服务可以创建完成所有工作的Interpreter。我在一个名为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();
    }

1 个答案:

答案 0 :(得分:2)

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

  

服务在其托管进程的主线程中运行 - 该服务   不会创建自己的线程,也不会在单独的进程中运行   (除非你另有说明)。这意味着,如果您的服务是   要做任何CPU密集型工作或阻止操作(如MP3)   播放或网络),你应该在其中创建一个新的线程   为这项工作服务。通过使用单独的线程,您将减少   应用程序无响应(ANR)错误的风险和   应用程序的主线程可以保持专用于用户交互   与您的活动。