2011-05-23 26 views
2

我有一個目前的問題:我有一個應用程序,並希望把主線程睡1500ms顯示我可以顯示一個ProgressDialog,我不知道該怎麼做。可以停止應用程序主線程?我可以使用另一個線程實現相同的目標嗎?如何把應用程序主線程睡覺?

回答

4

停止主線程通常是一個壞主意,因爲它也會停止所有UI交互處理。

嘗試製作進度對話框模態。這將阻止用戶在用戶界面上執行任何操作,直到對話框消失。我認爲這將實現你想做的事情,並與Android的工作方式兼容

1

不要停止主UI線程!它會凍結用戶界面。我可以想象你在一些後臺操作過程中顯示進度對話框。完成此操作後,只需發佈​​一些內容以通過處理程序更新UI。

進度對話框的作用是在長時間執行的同時與用戶進行交互。否則,你甚至不需要後臺操作和進度對話框。你只需要在主UI線程中執行操作並等待UI解凍。

1

你所要求的應該是不必要的,正如Carsten所說,這是一個壞主意。這是一個基本規則,你不會中斷UI線程,也只會更新該線程上UI的元素。在顯示對話框及其任何子類的時候,後臺沒有任何東西會收到任何輸入,所以儘管主線程正在運行,但除了對話框中發生的事情之外,什麼都不應該發生。

你可能要做的是使用類似AsyncTask()的東西來顯示你的ProgressDialog,做一些工作,然後在工作完成時解僱它。

1

不是一個好主意,要做到這一點,但如果你有使用這個

try { 
    Thread.sleep(1500); 
} catch (InterruptedException e) { 
    //handle 
} 
+3

'Thread.sleep()'是一個靜態方法。如果'this'是'Thread',上面的代碼會編譯,但會導致當前線程進入休眠狀態,這可能與'this'不一樣。也就是說,你不能讓另一個線程以這種方式睡覺。這段代碼表明程序員認爲它使得'this'睡眠,因爲它被封裝在一個(無意義的)'synchronized'塊中。這不是一個好方法,但這不是實施這種不好方法的方法。 – 2012-07-22 22:10:31

+0

我應該更具體一些,如果這是一項活動,那麼它會睡眠並阻止活動的UI達1500秒。 – Eshaan 2012-11-01 22:51:41

+0

...只有當你在UI線程中調用這個。這段代碼的問題是寫'this.sleep'而不是'Thread.sleep'。看起來你正試圖讓一個特定的線程休眠,當這不是該方法的功能時。 – 2012-11-02 10:04:44

0

要做到這樣的事情,你需要使用「的Runnable」與一起「處理程序」。正如其他人提到的,你不想停止主UI線程。由於只有一個,所以如果你讓它睡覺或等待,你將不會顯示任何更新。在另一個線程上查看運行代碼的下面的小樣本。

要做的主要事情是睡覺主線程意味着停止任何和所有的視覺更新。

// Class Variables 
private Handler mHandler; 

@Override 
public void onCreate(){ 
    // Create a Handler Object 
    // In Layman's terms, Handlers can run processes off the main 
    // User interface thread. 
    mHandler = new Handler(); 

    // Post a "Runnable" after a delay in milliseconds 
    // On a separate thread, the progressDialog_Runnable 
    // will call the function "createProgressDialog" 
    mHandler.postDelayed(progressDialog_Runnable, 250); 
} 

// Runnables (Process to run on separate thread) 
private Runnable progressDialog_Runnable; 
{ 
    progressDialog_Runnable = new Runnable(){ 
     @Override 
     public void run() { 
      createProgressDialog(); 
     } 
    }; 
} 

// Method you create to make the progress dialog 
private void createProgressDialog(){ 
    //... Run this code on a separate thread via Runnable 
}