2016-12-01 71 views
0

在Android應用程序中執行以下代碼時,setText發生在從另一個Service調用mainActivity.notify()之後。因此,看起來好像mainActivity.wait()在setText之前執行,導致setText等待。如何在Android中使用wait()函數時同步執行?

這可能是什麼原因以及如何在mainActivity.wait()之前執行Toast,以便在MainActivity等待時顯示setText。

public static Activity mainActivity; 
.... 
startButton.setText("Processing..."); 
synchronized(MainActivity.mainActivity) { 
       try { 
        mainActivity.wait(); 
       } catch (InterruptedException e) { 
       } 
      } 
startButton.setText("Start"); 
+0

你凍結UI線程?爲什麼? –

+0

您不能導致主(UI)線程等待。這是沒有理由的,Android框架不會允許它。它會因無響應而殺死你的應用。你想在這裏完成什麼? –

+0

@DavidWasser我明白這一點。我的MainActivity正在等待1-2秒,直到服務完成處理,以便它可以顯示服務生成的結果。 –

回答

3

首先,從來沒有一個活動的靜態引用。這是一個幾乎可靠的內存泄漏。如果你認爲你需要這樣做,你的整個應用程序的架構幾乎肯定是錯的,或者你不知道如何使用上下文。其次,像其他GUI OS一樣,Android是由事件循環驅動的。通過阻止主線程,可以防止執行事件循環,從而凍結整個應用程序。特別是在不運行事件循環的情況下,應用程序將永遠不會重繪。

第三,你不能等到Toast出現。系統自己顯示吐司,當它決定 - 例如,屏幕上可能有其他吐司。沒有機制被告知何時顯示吐司。敬酒的目的是火和忘記,如果你需要更強大的東西,你需要自己寫。

+0

1st:我會試着學習更多並刪除它。 第二:我的MainActivity正在等待1-2秒,直到服務完成處理,以便它可以顯示服務生成的結果。 第三:我知道這是一個吐司。但是其他的東西,比如改變按鈕上的文本,其行爲也是類似的[notify()之後執行,即使它是在wait()之前寫入的。 –

+1

使用等待和通知等服務完成是錯誤的。服務使用相同的線程,所以它永遠不會發生。如果需要通知服務完成計算,請使用綁定服務和回調。你永遠不應該在android(或任何其他基於gui的框架)的主線程中等待 –

+0

謝謝。這就是爲什麼,我正在通過在服務中創建另一個線程來進行處理。我會研究你提出的方法,並嘗試按照你所說的來實施。然而,令人驚訝的是爲什麼執行不同步。當我在wait()之前調用setText時,爲什麼它會在Service中調用notify()之後執行。 –

-4

可以使用了Thread.sleep方法

try { 
    Thread.sleep(1000);   
} catch (InterruptedException e) { 
    e.printStackTrace(); 
} 
+0

非常感謝。但是如何在我的處理完成後將其從服務中喚醒? –