2010-01-16 56 views
5

內我正在寫一個應用程序,基本上是圍繞一個250K JNI的包裝阻止對話框。 JNI(遊戲引擎)具有類似handle_penUp(int x,int y)的API。有時它需要從handle_penUp()內部(通過回調到Java代碼)查詢用戶,因此我用來實現查詢的對話框必須被阻止。從JNI代碼

據我瞭解,執行的主線程不能阻止。所以我產生了第二個線程,它使得所有可能導致需要阻塞的回調的JNI調用。在第二個線程中,當我需要建立阻塞對話框時,我調用startActivityForResult(),然後在信號量上獲取()。當onActivityResult()在主線程上被調用時,它調用同一信號量上的release()。

如果我的查詢將作爲一個新的活動來實現,但如果我想將現有的活動範圍內的ShowDialog()這工作。日誌消息告訴我我的線程需要Looper。我添加了一個 - 並會附加信息是否可行 - 但感覺好像我在這裏走錯了路。我需要的是做阻擋對話框配方(有用的,如果僅僅是因爲所有其他平臺擁有他們,因此移植的代碼往往會這樣的。)

回答

0

你肯定不希望兩個UI線程。就控制流程和顯示而言(即與繪圖,啓動活動,顯示對話框等有關的任何內容),應該只有一個與Android SDK進行通信的線程。

另外,請記住,你不想竟讓你的線程運行 - 一切基於事件,所以你希望你的代碼來響應的東西,做一些事情,然後儘快離開。

當你說「塊」時,你究竟是什麼意思?什麼需要被阻止?如果你只需要停止響應事件,爲什麼不在對話框可見的時候將布爾值設置爲true,並且在它爲真時忽略所有事件?

+0

可能阻止在攔截與非阻塞IO(電話之前,不會返回它已經獲得了請求的輸入或失敗,與立即返回並報告任何輸入(如果已經在緩衝區中) – 2010-09-24 04:47:03

2

聽起來非常接近一個問題,我與來自觸摸線程設置有形/無形的一些看法。

的問題是,你不能做對GUI的一些操作形成另一個線程(這是你的情況下)

你需要做的是在你的主線程使用手柄 我宣佈它在活動

public static final Handler handlerVisibility = new Handler() { 
    public void handleMessage(Message msg) { 
     int visibility = msg.getData().getInt("visibility"); 
     view.setVisibility(visibility); 
    } 
}; 

我選擇公共靜態,這樣我可以在任何地方訪問的選項(因爲我從來沒有在一個時間一個以上的電話,我覺得懶得把它傳遞到子類)。

那麼你想做的事就是將消息發送到該處理程序,並因爲處理程序是在同一個線程,因爲它的工作原理^^

Message msg = MainActivity.handlerVisibility.obtainMessage(); 
    Bundle b = new Bundle(); 
      b.putInt("visibility", View.VISIBLE); 
    msg.setData(b); 
      MainActivity.handlerVisibility.sendMessage(msg); 

的圖形用戶界面,應該解決您的尺蠖的錯誤,讓你從一個線程發送GUI請求另一個

希望它有助於

傑森