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线程跳过帧。

+0

这不是一个IntentService。 IntentServices从IntentService扩展。这是一个正常的服务,并在UI线程上完成它的工作。 –

+0

这是我变成了'IntentService'的'服务'。代码片段中描述了不同之处。这实际上只是这一点。 –

我发现了这个问题。鉴于我正在进行异步呼叫,在呼叫完成之前,我从onHandleIntent方法返回。问题是,stopSelf(int)被调用一次返回,因为它是由ServiceHandler实施:

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

IntentService没有被设计用来执行我正打算任务。在我的场景中,我将它重新实现为BackgroundService并删除stopSelf()以及其他修改,以尽可能保持BackgroundService线程活动(see this gist)。

+0

您没有意向服务。您发布的代码扩展了'服务' – Voski

+0

@Voski问题片段后面的第二段解释了我所做的 –

的Android IntentService放缓UI线程

没办法,你也知道IntentService创建工作线程,并使用该线程来运行服务。所以问题应该在别的地方。

+0

事实上,对我来说没有意义,但所描述的修改是导致问题的修改。我甚至将“IntentService”重写为“Service”,并且消息消失了(行为正确) –