2014-02-19 89 views
0

我已經搜索,沒有任何主題真的似乎有幫助,我的問題是我在PopupScreen上啓動一個線程,等待它完成,然後用適當的通知關閉PopupScreen,這裏是我的代碼同步線程IllegalStateException

LoginThread lt = new LoginThread(str1, str2); 
lt.start(); 

synchronized(lt){ 
    try{ 
     lt.wait(); 
    }catch(InterruptedException ie){ 
     ie.printStackTrace(); 
    } 
    //Everything works fine until here i add 
    close(); 
    //Or 
    this.close(); 

} 

private class LoginThread extends Thread{ 
    public LoginThread(String str1, String str2){ 

    } 

    public void run(){ 
     synchronized(this){ 
      notify(); 
     } 
    } 
} 

任何建議如何關閉此popuscreen?

+0

@downvoter - 我沒有看到downvoting這個問題的理由..請解釋一下自己.. – TheLostMind

回答

3

響應者應該知道這是一個BlackBerry Java問題,並且BlackBerry Java對此處理的影響可能在所提供的代碼中並不明顯。

從BlackBerry Java的角度來看,顯示PopupScreen有很多原因,其中之一是在發生某些後臺處理時鎖定用戶。然而,這種鎖定永遠不會使用線程。等待。 BlackBerry Ui處理使用事件驅動模型,因爲我理解它有點像Swing(我不是Swing專家)。這樣做的結果是,如果您嘗試編寫等待並且您試圖阻止用戶繼續前進,那麼您必須等待事件線程完全阻止用戶輸入。如果您嘗試執行此操作,BlackBerry OS barfs(除了在模擬器上,它有時會因爲某種原因允許您執行此操作)。

更多關於這一點,在這裏看到:

What-is-the-Event-Thread

在這種情況下,用戶希望關閉彈出屏幕,一旦長時間運行的處理已完成。我建議使用類似Observer模式的模式來做這件事,換句話說,在完成時讓Thread調用Observer(PopupScreen)。觀察者(屏幕)可以關閉自己。

同時,顯示的屏幕(觀察者)可以忽略通常會關閉它的事件,如'Esc'鍵。該屏幕將顯示對用戶有用的內容,例如「請稍等」。

但有一點要小心,回調會發生在後臺線程上,但是如果你想要做Ui處理,close必須在Event Thread上。交換到一個事件線程上下文使用如下代碼通常完成:

UiApplication.getUiApplication().invokeLater(new Runnable() { 
    public void run() { 
    // put code in here 
    } 
}); 

這一切說,我再次建議樓主搜索,因爲我覺得有這樣各地的許多樣品。在我看到的所有樣本中,沒有人使用過等待,所以我不太明白爲什麼OP首先嚐試使用等待。如果在樣本中看到這一點,請指出它(在評論中),以便我可以嘗試修復它。

+0

我還沒有看到它的任何樣本,但我想不出另一個等待線程完成,但你的意見已經幫助我把'close()'放在你提供的運行方法中,它工作,謝謝 – s3nzoM

+0

「Synchronized thread illegalstateexception」我的問題是關閉「關閉」它不是如何工作的,我可以用'if Characters.ESCAPE)close()',這是它似乎工作的唯一情況 – s3nzoM

0

您可能必須在關閉自己之前釋放所有鎖。將關閉移出同步範圍。另外,你應該把start()放在synchronized塊中,否則在你到達wait()之前線程可能會通知()。

-1

從哪裏開始。代碼是一團糟,我不會鎖定一個'線程',因爲它只是令人困惑。除此之外,你的等待是不可靠的,因爲虛假的通知是可能的;所以你可以沒有特別的理由被喚醒。

這意味着你需要在一個循環中做到這一點,但在你的情況下,沒有你正在等待的條件。

我會忘記使用同步。在這種情況下,我會查看您初始化爲一個的CountDownLatch。登錄線程將執行倒計時,主線程將執行等待並阻塞,直到登錄線程調用倒計時。這樣你就不需要處理自定義同步。