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)。
我的 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)。