2011-09-30 86 views
1

我想在此期間發出一個http請求(我使用kso​​ap2)onCreate(),我希望屏幕上有ProgressDialog來阻止用戶。請求完成後,我想使用從我的http請求中檢索到的元素完成我的onCreate。活動和線程處理

現在:

我有一個類實現了Runnable。我在我的onCreate中實例化它。該類發出http請求,在此期間ProgressDialog在屏幕上。完成後,ProgressDialog將被解除。但由於它不在UI線程中,因此在獲取http請求的結果之前,會執行onCreate的以下內容。

我也試過,首先:在OnCreate我做我的ProgressDialog的show()然後HTTP請求,然後一個dismiss() ProgressDialog終於完成我的onCreate我的HTTP請求的結果......這是除了ProgressDialog OK這次沒有顯示。

對不起,我的英語真的沒有幫助。

無論如何,想法?

謝謝。

PS:順便說一聲,我知道AsyncTask更好,這是我通常使用的,但它與ProgressDialog並不容易。

我的問題是:有沒有辦法在onCreate()做出http請求來獲得int的值。在發出此請求時:顯示ProgressDialog以阻止用戶,但也會阻止UI線程,以便onCreate的末尾可以在完成後使用http請求檢索的值。

一個醜陋的方式將是一個循環在onCreate與休眠等待值被檢索......這真的很難看。

+0

即使它不是那麼容易,你應該選擇AsyncTask。這是您的問題的正確解決方案。 –

+0

如果我解決了我的問題,我肯定會回到這個。我編輯我的問題更清晰......我希望。謝謝。 – mthpvg

回答

1

編輯:我知道你提到你不想使用AsyncTask由於顯示ProgressDialog的複雜性,但除非我錯過了一些東西,它應該像下面一樣簡單。或者,您可以使用處理程序來觸發回撥?

我想你需要某種處理程序來回調,一旦HTTP請求完成,然後在回調完成你的代碼。

我還使用ksoap2進行Web服務調用,並在調用它時顯示ProgressDialog。一旦Web服務器調用完成,它會引發一個事件,並關閉ProgressDialog。我不確定這是否會對您有所幫助,但我有以下(當然,可能有更好的方法,但這對我有用),這樣ProgressDialog在UI線程上被調用,AsyncTask完成並調用完整的方法(它返回線程回到UI),我關閉該對話框:

// Notify user the web service is connecting 
    final ProgressDialog dialog = ProgressDialog.show(
      Screen_GlobalLeaderboard.this, "Getting scores", 
      "Please wait...", true); 
    dialog.setCancelable(true); 

    WebService ws = new WebService(this) { 

     @Override 
     public void webServiceCallComplete(boolean success, Object data, 
       String errorMessage, WebMethods callingWebMethod) { 


      dialog.dismiss(); 

      // Your complete code here 
     } 
    }; 

    ws.getTopLeaderboardResults(top, gameMode); 

編輯:我想你問的是onCreate(從UI線程RAN),你想顯示ProgressDialog並在同一個方法中從HTTP請求返回一個值,一旦它完成,隱藏對話框。

然後你說你已經試過,並且ProgressDialog沒有顯示。這是因爲您使用HTTP請求阻止UI線程。

提供了調用從onCreate方法的HTTP請求,你必須在一個單獨的線程(或爲你做,實現Runnable)和處理程序將調用運行的,使用它可以再處理的返回值運行。

簡而言之,你不能:

顯示ProgressDialog>呼叫HTTP請求>獲取值>隱藏ProgressDialog無需添加其他線程的HTTP請求(或ProgressDialog不會顯示),這反過來又意味着你的回報HTTP請求代碼必須在調用onCreate方法之外。

+0

對不起,我不知道什麼是WebService,也不是覆蓋方法。謝謝。 – mthpvg

+0

WebService是一個抽象類,它調用一個AsyncTask,一旦它完成,它調用'webServiceCallComplete',你可以關閉對話框。或者,使用加載'ProgressDialog',運行一個線程來完成工作,並使用一個處理程序來調用'runnable'來關閉對話框,並根據返回值執行所需操作。 – Ricky

+0

好吧,我明白了。我編輯我的問題,因爲它更多地關於在顯示ProgressDialog時阻止UI線程等待結果。完成後,關閉對話框,並使用獲得的結果「恢復」創建。 – mthpvg

1

在你oncreate顯示dialog first,然後創建一個thread做你http task那裏,一旦你做完這些調用從線程handlerdismiss你的對話框。

+0

通過將對話框放入Runnable類中,它的工作方式與我的解決方案一樣好。謝謝。 – mthpvg