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

如何在独立的android服务中避免ANR,android,service,Android,Service,您好,谢谢您的帮助: 我想把一个java系统移植到Android上,我想通过一个透明的独立服务让第三方应用程序可以使用它,这样它就像一个系统库。 该系统是一个VoiceXML解释器,它将解释由第三方应用程序处理的文档,并将结果返回给第三方应用程序。 对这些文件的解释可能需要任意的时间,甚至很长的时间 现在我有一个服务,它创建了一个解释器来完成所有的工作。我在一个名为startJVoiceXML()的方法中实现了这一点 问题是,我的服务在创建后大约20到30秒被Android以ANR终止。 但是如

您好,谢谢您的帮助:

我想把一个java系统移植到Android上,我想通过一个透明的独立服务让第三方应用程序可以使用它,这样它就像一个系统库。 该系统是一个VoiceXML解释器,它将解释由第三方应用程序处理的文档,并将结果返回给第三方应用程序。 对这些文件的解释可能需要任意的时间,甚至很长的时间

现在我有一个服务,它创建了一个解释器来完成所有的工作。我在一个名为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();
    }
public synchronized void startJVoiceXML(最终URI)抛出JVoiceXMLEvent,InterruptedException
{
AndroidConfiguration config=新的AndroidConfiguration();
jvxml=新的JVoiceXmlMain(配置);
jvxml.addListener(这个);
jvxml.start();
int a=0;
//等待不是问题所在,jvxml对象运行方法在该线程上执行.notifyAll()的服务中调用jvxmlStarted
这个。等等();
//这只是为了“执行”一些长时间运行的操作,以模拟解释器的行为

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

服务在其宿主进程的主线程中运行 不创建自己的线程,也不在单独的进程中运行 (除非您另有说明)。这意味着,如果您的服务 执行CPU密集型工作或阻塞操作(如MP3) 播放或联网),您应该在 通过使用单独的线程,您将减少 应用程序不响应(ANR)错误的风险和 应用程序的主线程可以保持专用于用户交互 与你的活动


非常感谢,凯。我会的。