2012-08-25 55 views
0

我想它,只要我點擊登錄按鈕顯示出操作的結束,但它只能顯示洛過程完成不確定的進度欄只顯示非常簡要地

後,我在做什麼錯

runOnUiThread(new Runnable() { 
      public void run() { 
       mProgress.setVisibility(View.VISIBLE); 
      } 
     }); 

     doLogin();   
     mProgress.setVisibility(View.INVISIBLE); 
+0

不doLogin()是一個阻塞方法(不是異步)? –

+0

它不是異步編號 – code511788465541441

+0

你是否在GUI線程中調用它? –

回答

0

由於您使用的是另一個線程來顯示可見性,因此runnable可能會在將來的任何時間安排。這是它遲到的原因。

也許在runonuithread調用之後立即在當前線程中添加一個睡眠例程可能會調度可運行,但永遠無法確定。

編輯:或者你可以創建一個處理程序,顯示進度條,並等待要顯示它,然後繼續

+0

,沒有工作。但我現在通過將所有doLogin工作移動到AsyncTask類中來解決它 – code511788465541441

0

的原因你沒有看到加載對話框,你調用一個阻塞函數在你的GUI線程/ MAIN線程。當您將對話框設置爲可見時,應讓GUI線程繼續運行,以便它可以在屏幕上繪製對話框。此外,5秒後GUI線程被阻止,用戶將看到FORCE CLOSE /等待彈出。

執行gui線程的長時間運行是一種不好的做法,你只能在其中使用非阻塞函數。

這裏是你應該怎麼做:

//make sure mProgress is final 
mProgress.setVisibility(View.VISIBLE); 
new Thread(){ 
    public void run(){ 
     doLogin(); 
     mProgress.setVisibility(View.INVISIBLE); 
    } 
}.start(); 
+0

doLogin()中有很多與UI元素的交互,所以我得到一個錯誤,我不能訪問它們的不同線程 – code511788465541441

+0

因此,如果doLogin應該與用戶交互作爲異步任務,你可以使用updateprogress向用戶顯示登錄對話框,谷歌異步任務 –

相關問題