如果我设置了断点并且服务主线程在那里停止,则整个服务进程在几秒钟后(大约5)被Android关闭。当发生这种情况时也几乎不可能进行操作(无法评估表达式,看不到当前上下文变量等)。如果它不是服务主线程,那么没有问题,调试工作就很好。调试服务主线程
该服务通过活动启动。
那么,有没有办法调试一个没有Android的服务主线程杀死它?
在此先感谢!
如果我设置了断点并且服务主线程在那里停止,则整个服务进程在几秒钟后(大约5)被Android关闭。当发生这种情况时也几乎不可能进行操作(无法评估表达式,看不到当前上下文变量等)。如果它不是服务主线程,那么没有问题,调试工作就很好。调试服务主线程
该服务通过活动启动。
那么,有没有办法调试一个没有Android的服务主线程杀死它?
在此先感谢!
没有,如果你必须使用主线程。这就是说有几种方法可以使它不在主线程上运行,具体取决于你使用服务的方式。
如果您从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方法的服务。只要服务类不是最终的,这应该工作。
现在你至少可以调试了。
谢谢你的答案,但我正在寻找让它在主线程停下来的方法。我知道我可以停止在其他线程,并已经测试它,它工作正常,但这是一个固定的服务,我不能修改。 – m0skit0
我更新了我的评论和更多建议,如果这不起作用,我恐怕没有办法做到这一点 – nickmartens1980
我不明白ANR通知如何帮助我解决问题......但服务包装是一个很好的建议,谢谢! – m0skit0
对dowvotes的评论是值得欢迎的,所以我可以改善我的问题,如果有什么不对,谢谢:) – m0skit0
你的服务在做什么?我有一个服务,我用来连接ws ...是你的情况吗? –
我的服务执行不同的东西,太多以在这里列出所有。为什么这是相关的? – m0skit0