2015-02-09 70 views
0

我已經構建了一個Android應用程序,它從六個不同的活動中調用TCP套接字相關的線程。它工作的很好,但是當我嘗試添加一個簡單的對話框時,會在啓動線程之前詢問用戶的id/pw(在線程中需要檢索的數據),所以我遇到了麻煩。有一個實際調用來啓動線程的適配器類,但它也不是可以實現對話框的「活動」。Android創建並返回來自非活動類調用的對話框的值

有什麼辦法可以解決這個在一些更聰明的方法?添加六個相同的代碼來創建對話框,併爲每個對話框添加六個相同的處理程序將解決這個問題,但我認爲這不是正確的做法。

我試圖讓對話框成爲一個Activity(帶有一個對話框主題),但它不能返回任何數據,因爲啓動這個對話框的類不像Activity那樣是一個Activity(因此startActivityForResult無效)。

我該如何解決這個問題?改革整個來源是不可能的,因爲它已經超過2萬行。請幫忙!

回答

1

不是UI /主線程的線程不能像對話框那樣控制UI元素。但是有一種方法可以使代碼的一部分在主線程上運行,然後您可以執行此類操作。

要張貼的東西像這樣的主處理器:

new Handler().post(new Runnable{ 
    public void run(){ 
     //Be sure to pass your Activity class, not the Thread 
     AlertDialog.Builder builder = new AlertDialog.Builder(MyActivity.this); 
     //... setup dialog and show 
    } 
}); 
+0

不可思議!將這個代碼塊添加到我的適配器類中是否解決了整個問題?我的意思是,我需要更多東西嗎? – March3April4 2015-02-09 11:26:15

+0

那麼你仍然需要弄清楚如何將信息返回到原始線程。我想你需要一些UI線程可以調用的公用方法來存儲用戶的值。 – peedee 2015-02-09 11:31:48

0

嗯,我終於想通了這個簡單的問題。

要在非UI線程上調用Dialog.show(),我需要一個使用Looper.getMainLooper()創建的Handler對象。然後,就像@peedee解釋的那樣,在run()塊中實現要做的事情(與UI相關的工作)。

接收通過對話檢索到的數據也不困難。在我的Dialog類中添加一些getter方法,並在顯示對話框之前添加一個OnDismissListener是我所需要的。 (OnDismissListener會在對話框的dismiss()函數被調用時作出反應。)

這是我寫的代碼。希望它可以提供幫助。

Handler mHandler = new Handler(Looper.getMainLooper()); 
    mHandler.postDelayed(new Runnable() { 

     @Override 
     public void run() { 
      // TODO Auto-generated method stub 
      Log.e("TESTRUNNABLE", "RUNNABLE LOADED"); 
      cDialog = new TestDialog(mContext); 
      cDialog.setTitle("GROUP USER LOGIN"); 
      cDialog.setOnDismissListener(new OnDismissListener(){ 
       @Override 
       public void onDismiss(DialogInterface dialog) { 
        // TODO Auto-generated method stub 
        nameStr = cDialog.getNameStr(); 
        pwStr = cDialog.getPwStr(); 
        Toast.makeText(mContext, nameStr + ", " + pwStr, 3000).show(); 
        Log.e("DISMISSLISTENER", nameStr + ", " + pwStr); 
       } 
      }); 
      cDialog.show(); 
     } 

    }, 0); 
相關問題