2012-09-06 20 views
0

我知道onStartCommand中的代碼將在主線程上運行。 在這個方法中,我產生了一個新的網絡線程,它與服務器通信,當它完成時,它執行一個回調方法,該方法也在主線程中運行。在主線程中運行的回調方法是否可以在onStartCommand中運行?

我的問題是,如果onStartCommand和回調方法都在主線程中執行,並且在網絡調用結束時執行回調方法,是否有可能執行回調方法的代碼行在執行onStartCommand方法的過程中?

這是如何工作的?

+1

它不清楚你的回調方法是什麼意思,如果它從網絡線程方法,你怎麼知道它會在主線程上執行?它是否創建並排隊某種由主線程處理和執行的請求? – Brady

+0

是的,我正在使用http://loopj.com/android-async-http/,並在線程池中觸發網絡調用。但是,每當它完成時,它會調用onSuccess或onFailure,並在主線程中處理這些方法。 –

+1

然後,就像@Brady暗示的那樣,主線程運行的代碼不可能被「中斷」,主線程不可能在中間運行其他任何東西。如果其他任何東西都在中間運行,那麼另一個線程正在運行它。 –

回答

1

如果產生的網絡線程進行了一個函數調用,您肯定會在主線程中執行,那麼實現這個功能的唯一方法就是使用某種共享資源,最常見的方式是:某種工作隊列,一個套接字或兩個線程之間共享的變量(通過方法調用設置)必須由主線程調用,以使其執行某種方法。

我認爲最簡單的方法是一個工作隊列,但根據您在註釋中發佈的鏈接,它提到了JSON,它通常使用TCP/IP套接字。我將介紹每種方法通常如何工作。

工作隊列:

網線會建立某種形式的工作項的排隊和它的主線程工作隊列。如果主線程位於方法的中間(onStartCommand()),那麼它也不能執行工作條目。最有可能的是,當它完成當前的方法時,它將返回並返回到輪詢方法,將條目從隊列中取出。因此,如果使用這種方法,那麼的onSuccess()和onFailure處()將創建並將從onStartCommand()

JSON插槽返回後執行入隊的工作項目:

這種方法是非常相似的工作隊列,但不是工作條目,套接字消息將被使用。並且將會有一個函數將會輪詢(很可能通過select()或poll())套接字並將接收到的消息視爲工作項。因此,如果使用這種方法,那麼onSuccess()和onFailure()將創建併發送從onStartCommand返回後執行的套接字消息()

+0

非常感謝@布雷迪,今天你真的幫了我很多。 –

+0

@HéctorJúdezSapena,很樂意幫忙。我喜歡你有趣的問題! – Brady

相關問題