我的IntentService正在提升“跳过的XX帧!应用程序可能在其主线程上做了太多工作。”消息在LogCat中,但我不明白为什么。
我正在开发一个与P2P代理通信的应用程序。我决定将所有通信逻辑移到服务中。最初我是以这种方式做事:
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id='app'/>
即使我没有创建工作线程来处理所有逻辑,它也运行正常。但由于我需要实现更多的连接逻辑,我决定将逻辑移到IntentService,因为它处理后台工作线程上的所有内容。
我所做的只是将基类重命名为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
方法中的内容移至onStartCommand()
,为该特定情况指定一个动作常量并删除{{1 }和onHandleIntent()
覆盖。
这种变化如何影响主线程的性能?
修改
可能相关,但onStartCommand()
和onBind()
都会从异步的框架中运行某些方法。具体而言,与代理进行通信的方法是。话虽这么说,我可能会放弃stablishEndpointAndTransport()
,因为硬件已经在另一个线程上运行(解释为什么它实际上运行正常registerAccountId()
)。不过,我不明白为什么IntentService
正在制作UI线程跳帧。
答案 0 :(得分:1)
Android IntentService减慢UI线程
没办法,如您所知,IntentService创建一个工作线程并使用该线程来运行该服务。所以问题应该在其他地方。
答案 1 :(得分:1)
我发现了这个问题。鉴于我正在进行异步调用,我在调用完成之前从stopSelf(int)
方法返回。问题是,ServiceHandler
一旦返回就会被调用,因为它由@Override
public void handleMessage(Message msg) {
onHandleIntent((Intent)msg.obj);
stopSelf(msg.arg1);
}
实现:
IntentService
BackgroundService
并非旨在执行我想要的任务。在我的方案中,我将其重新实现为stopSelf()
并删除了BackgroundService
以及其他修改,以尽可能长时间地保持{{1}}线程处于活动状态(see this gist)。