Android IntentService 正在减慢 UI 线程

Android IntentService slowing down UI Thread

我的 IntentService 在 LogCat 中引发 "Skipped XX frames! The application may be doing too much work on its main thread." 消息,但我不明白为什么。

我正在开发一个与 P2P 代理通信的应用程序。我决定将所有通信逻辑移至服务。最初我是以那种方式做的事情:

class MyService extends Service {
    @Override
    onCreate() {
        // This info need to stay up as long as the context is
        stablishEndpointAndTransport();
    }

    @Override
    onStartCommand(Intent intent, int startId) {
        registerAccountId(intent.getIntExtra(EXTRA_ACCOUNT_ID));
    }

    @Override
    IBinder onBind(Intent intent) {
        super.onBind(intent);
    }

    @Override
    onDestroy() {
        if (registeredAccount) deleteAccount();
        deleteTransportAndEndpoint();
    }
}

它 运行 好的,即使我没有创建工作线程来处理所有这些逻辑。但由于我需要实现更多的连接逻辑,我决定将逻辑移至 IntentService,因为它在后台工作线程上处理所有事情。

我所做的只是将基础 class 重命名为 IntentService,将 onStartCommand() 方法中的内容移动到 onHandleIntent(),指定一个特定的动作常量大小写和擦除 onStartCommand()onBind() 覆盖。

该更改如何影响主线程的性能?

编辑

可能相关,但 stablishEndpointAndTransport()registerAccountId() 运行 框架中的一些方法是 异步的 。具体来说,与代理通信的方法是。话虽如此,我可能会放弃 IntentService,因为艰苦的工作已经 运行 在另一个线程上(解释为什么它实际上 运行 和 Service 一样好)。仍然,我不明白为什么 IntentService 使 UI 线程跳帧。

Android IntentService slowing down UI Thread

不可能,如您所知,IntentService 创建了一个工作线程并使用该线程来 运行 服务。所以问题应该出在其他地方。

我找到问题了。鉴于我正在进行异步调用,我在调用完成之前从 onHandleIntent 方法返回。问题是 stopSelf(int) 被调用一次 returns,因为它是由 ServiceHandler:

实现的
@Override
public void handleMessage(Message msg) {
    onHandleIntent((Intent)msg.obj);
    stopSelf(msg.arg1);
}

IntentService 并不是为了执行我想要的任务而设计的。对于我的场景,我将其重新实现为 BackgroundService 并删除了 stopSelf() 以及其他修改,以尽可能长时间地保持 BackgroundService 线程处于活动状态 (see this gist)。