Android IntentService降低了UI线程的速度

时间:2017-03-28 17:03:39

标签: java android performance service p2p

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

2 个答案:

答案 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)。