Android IntentService减慢UI线程
My IntentService正在提高“跳过了XX帧!应用程序可能在其主线程上做了太多工作。” LogCat中的消息,但我不明白为什么。Android IntentService减慢UI线程
我正在开发一个与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,因为它处理后台工作线程上的所有内容。
我所做的只是基类重命名为IntentService
,在onStartCommand()
方法的内容移动到onHandleIntent()
,指定动作不断向特定情况和擦除onStartCommand()
和onBind()
覆盖。
这种变化如何影响主线程的性能?
编辑
可能是相关的,但两者stablishEndpointAndTransport()
和registerAccountId()
运行从框架中的一些方法是异步。具体来说,与经纪人沟通的方法是。话虽如此,我可能会放弃IntentService
,因为辛苦工作已经在另一个线程上运行(请解释为什么它实际上运行良好,为Service
)。不过,我不明白为什么IntentService
正在制作UI线程跳过帧。
我发现了这个问题。鉴于我正在进行异步呼叫,在呼叫完成之前,我从onHandleIntent
方法返回。问题是,stopSelf(int)
被调用一次返回,因为它是由ServiceHandler
实施:
@Override
public void handleMessage(Message msg) {
onHandleIntent((Intent)msg.obj);
stopSelf(msg.arg1);
}
IntentService
没有被设计用来执行我正打算任务。在我的场景中,我将它重新实现为BackgroundService
并删除stopSelf()
以及其他修改,以尽可能保持BackgroundService
线程活动(see this gist)。
您没有意向服务。您发布的代码扩展了'服务' – Voski
@Voski问题片段后面的第二段解释了我所做的 –
的Android IntentService放缓UI线程
没办法,你也知道IntentService创建工作线程,并使用该线程来运行服务。所以问题应该在别的地方。
事实上,对我来说没有意义,但所描述的修改是导致问题的修改。我甚至将“IntentService”重写为“Service”,并且消息消失了(行为正确) –
这不是一个IntentService。 IntentServices从IntentService扩展。这是一个正常的服务,并在UI线程上完成它的工作。 –
这是我变成了'IntentService'的'服务'。代码片段中描述了不同之处。这实际上只是这一点。 –