【问题标题】:Debugging a Service main thread调试服务主线程
【发布时间】:2013-07-09 16:26:31
【问题描述】:

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

Service 通过 Activity 启动。

那么,有没有办法在不被 Android 杀死的情况下调试 Service 主线程?

提前致谢!

【问题讨论】:

  • 欢迎对downvotes发表评论,如果有任何问题我可以改进我的问题,谢谢:)
  • 你们的服务是做什么的?我有一个用来连接 ws 的服务……是你的情况吗?
  • 我的服务执行不同的操作,这里不一一列举。为什么这很重要?
  • 因为,我在调试时遇到了一些服务问题,因为我正在暂停线程,... android 杀死它(抛出异常并杀死它)
  • 在我的情况下没有抛出异常。并且看起来Service没有被杀死,但是调试器被无缘无故地分离了。

标签: android debugging service


【解决方案1】:

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

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

更新:

可能有一个开发选项可以帮助您在设备的开发选项中启用显示所有 ANR。当您阻止服务主线程而不是仅仅杀死它时,这可能会显示 ARN(此选项存在于运行 android 4.1.2 的手机上)

如果这不起作用,您可以使用此 hack:

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

创建一个扩展 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 方法。只要服务类不是最终的,这应该可以工作。

现在你至少可以调试它了。

【讨论】:

  • 感谢您的回答,但我正在寻找一种让它在主线程停止的方法。我知道我可以在其他线程上停下来并且已经对其进行了测试并且工作正常,但这是我无法修改的固定服务。
  • 我更新了我的评论,提出了更多建议,如果这不起作用,恐怕没有办法做到这一点
  • 我看不出 ANR 通知如何帮助解决我的问题...但是服务包装是一个不错的建议,谢谢!
  • 由于 ANR,您可以告诉 android 等待服务响应而不是终止服务
  • 即使它没有解决问题,但你的回答提供了我没有考虑过的创造性解决方案,所以我给你赏金;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多