2013-06-05 61 views
2

如果我设置了断点并且服务主线程在那里停止,则整个服务进程在几秒钟后(大约5)被Android关闭。当发生这种情况时也几乎不可能进行操作(无法评估表达式,看不到当前上下文变量等)。如果它不是服务主线程,那么没有问题,调试工作就很好。调试服务主线程

该服务通过活动启动。

那么,有没有办法调试一个没有Android的服务主线程杀死它?

在此先感谢!

+0

对dowvotes的评论是值得欢迎的,所以我可以改善我的问题,如果有什么不对,谢谢:) – m0skit0

+0

你的服务在做什么?我有一个服务,我用来连接ws ...是你的情况吗? –

+0

我的服务执行不同的东西,太多以在这里列出所有。为什么这是相关的? – m0skit0

回答

4

没有,如果你必须使用主线程。这就是说有几种方法可以使它不在主线程上运行,具体取决于你使用服务的方式。

如果您从onStartCommand运行: 在执行程序(在不同的线程中)运行进程或在意图服务中使用,这将自动为您执行此操作。 如果您使用onbind: 同样适用,请在后台运行它,但intentservice无法帮您解决这个问题。如果是这种情况,让我知道我会告诉你如何做到这一点。

更新:

有可能是一个发展的选择,可以帮助你,在你的设备的发展选择,使显示所有ANR。这可能表明一个ARN当你阻止服务主线程,而不是仅仅杀死它

(此选项运行Android 4.1.2我的手机上存在)如果不工作,你可以使用这个技巧:

由于您无法更改该服务本身的代码,因此您可以尝试以下有点混乱和骇人听闻的问题。不能保证它可以工作,但可能值得一试。

创建一个扩展IntentService的新服务。在onCreate中创建一个包装服务,扩展你想要调试的服务。喜欢这个。将其保存为一个变量并调用它的所有生命周期方法。 onStartCommand

mWrappedService = new YourServiceClass() { 

    { 
      attachBaseContext(WrappingService.this); 
    } 

    public IBinder onBind(Intent intent) { 
     return super.onBind(intent); 
    } 

    @Override 
    public Context getBaseContext() { 
     return WrappingService.this; 
    }   
} 

在本例中,WrappingService是您的新类,YourServiceClass是您尝试调试的服务。

然后在你的onHandleIntent中调用onStartCommand方法的服务。只要服务类不是最终的,这应该工作。

现在你至少可以调试了。

+0

谢谢你的答案,但我正在寻找让它在主线程停下来的方法。我知道我可以停止在其他线程,并已经测试它,它工作正常,但这是一个固定的服务,我不能修改。 – m0skit0

+0

我更新了我的评论和更多建议,如果这不起作用,我恐怕没有办法做到这一点 – nickmartens1980

+0

我不明白ANR通知如何帮助我解决问题......但服务包装是一个很好的建议,谢谢! – m0skit0