2017-03-28 67 views
0

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'的'服務'。代碼片段中描述了不同之處。這實際上只是這一點。 –

回答

0

我發現了這個問題。鑑於我正在進行異步呼叫,在呼叫完成之前,我從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問題片段後面的第二段解釋了我所做的 –

1

的Android IntentService放緩UI線程

沒辦法,你也知道IntentService創建工作線程,並使用該線程來運行服務。所以問題應該在別的地方。

+0

事實上,對我來說沒有意義,但所描述的修改是導致問題的修改。我甚至將「IntentService」重寫爲「Service」,並且消息消失了(行爲正確) –