2013-06-05 92 views
2

如果我設置了斷點並且服務主線程在那裏停止,則整個服務進程在幾秒鐘後(大約5)被Android關閉。當發生這種情況時也幾乎不可能進行操作(無法評估表達式,看不到當前上下文變量等)。如果它不是服務主線程,那麼沒有問題,調試工作就很好。調試服務主線程

該服務通過活動啓動。

那麼,有沒有辦法調試一個沒有Android的服務主線程殺死它?

在此先感謝!

+0

對dowvotes的評論是值得歡迎的,所以我可以改善我的問題,如果有什麼不對,謝謝:) – m0skit0

+0

你的服務在做什麼?我有一個服務,我用來連接ws ...是你的情況嗎? –

+0

我的服務執行不同的東西,太多以在這裏列出所有。爲什麼這是相關的? – m0skit0

回答

4

沒有,如果你必須使用主線程。這就是說有幾種方法可以使它不在主線程上運行,具體取決於你使用服務的方式。

如果您從onStartCommand運行: 在執行程序(在不同的線程中)運行進程或在意圖服務中使用,這將自動爲您執行此操作。 如果您使用onbind: 同樣適用,請在後臺運行它,但intentservice無法幫您解決這個問題。如果是這種情況,讓我知道我會告訴你如何做到這一點。

更新:

有可能是一個發展的選擇,可以幫助你,在你的設備的發展選擇,使顯示所有ANR。這可能表明一個ARN當你阻止服務主線程,而不是僅僅殺死它

(此選項運行Android 4.1.2我的手機上存在)如果不工作,你可以使用這個技巧:

由於您無法更改該服務本身的代碼,因此您可以嘗試以下有點混亂和駭人聽聞的問題。不能保證它可以工作,但可能值得一試。

創建一個擴展IntentService的新服務。在onCreate中創建一個包裝服務,擴展你想要調試的服務。喜歡這個。將其保存爲一個變量並調用它的所有生命週期方法。 onStartCommand

mWrappedService = new YourServiceClass() { 

    { 
      attachBaseContext(WrappingService.this); 
    } 

    public IBinder onBind(Intent intent) { 
     return super.onBind(intent); 
    } 

    @Override 
    public Context getBaseContext() { 
     return WrappingService.this; 
    }   
} 

在本例中,WrappingService是您的新類,YourServiceClass是您嘗試調試的服務。

然後在你的onHandleIntent中調用onStartCommand方法的服務。只要服務類不是最終的,這應該工作。

現在你至少可以調試了。

+0

謝謝你的答案,但我正在尋找讓它在主線程停下來的方法。我知道我可以停止在其他線程,並已經測試它,它工作正常,但這是一個固定的服務,我不能修改。 – m0skit0

+0

我更新了我的評論和更多建議,如果這不起作用,我恐怕沒有辦法做到這一點 – nickmartens1980

+0

我不明白ANR通知如何幫助我解決問題......但服務包裝是一個很好的建議,謝謝! – m0skit0