2014-11-05 27 views
0

我試圖將AlertDialog轉換爲AsyncTask。我編寫了這個代碼,它的工作原理,但是當我選擇了凍結前AlertDialogAlertDialog中的項目但前臺UI正在工作。請幫助我爲我的任務編寫正確的代碼或幫助我請在選擇項目後修復凍結AlertDialog。我試圖在uiHandler.getLooper.suit()行之前調用dismiss()方法,但沒有任何更改。使用AlertDialog處理AsyncTask

@Override 
protected Void doInBackground(Void... arg0) { 
    Looper.prepare(); 
    final Handler uiHandler = new Handler(); 
    uiHandler.post(new Runnable() { 
     public void run() { 
      AlertDialog.Builder chooser = new AlertDialog.Builder(ctx); 
      facultyChooser.setTitle("Choose") 
        .setCancelable(false) 
        .setItems(faculties, new DialogInterface.OnClickListener() { 
         @Override 
         public void onClick(DialogInterface dialog, int item) { 
          uiHandler.getLooper().quit(); 
         } 
        }) 
        .create() 
        .show(); 
     } 
    }); 
    Looper.loop(); 
} 

PS:這不是完整的代碼,以方便閱讀。

+0

uiHandler.getLooper()。quit();在onClick中調用。檢查通過刪除.. – Aun 2014-11-05 10:51:32

+0

@Aun,如果我刪除它Looper不會停止。關閉對話框後沒有任何事情發生。 – AskQuestion 2014-11-05 10:58:54

回答

1

我認爲發生錯誤是因爲您嘗試在doInBackground(後臺線程)中運行Handler(UI線程)。我的解決方案將確保您在UI線程中創建的警報對話框。

移動驗證碼:

 AlertDialog.Builder chooser = new AlertDialog.Builder(ctx); 
     facultyChooser.setTitle("Choose") 
       .setCancelable(false) 
       .setItems(faculties, new DialogInterface.OnClickListener() { 
        @Override 
        public void onClick(DialogInterface dialog, int item) { 
         uiHandler.getLooper().quit(); 
        } 
       }) 
       .create() 
       .show(); 

onPostExecuteonPreExecute以確保在UI線程上創建對話框。

並刪除final Handler uiHandler = new Handler();,因爲onPostExecute/onPreExecute已經在UI線程上運行。

+0

我無法將其移入onPostExecute,因爲onPostExecute正在保存我的解析結果。 – AskQuestion 2014-11-05 11:01:03

+0

@AskQuestion更新,做onPreExecute – 2014-11-05 11:01:34

+0

不,它不工作。 – AskQuestion 2014-11-05 11:30:58

1

根據我的理解,你不需要Looper和所有在這種情況下。你可以請嘗試跟隨?

protected Void doInBackground(Void... arg0) { 
    Handler uiHandler = new Handler(Looper.getMainLooper()); 
    uiHandler.post(new Runnable() { 
     public void run() { 
      AlertDialog.Builder chooser = new AlertDialog.Builder(ctx); 
      facultyChooser.setTitle("Choose") 
        .setCancelable(false) 
        .setItems(faculties, new DialogInterface.OnClickListener() { 
         @Override 
         public void onClick(DialogInterface dialog, int item) { 
          dialog.dismiss(); 
         } 
        }) 
        .create() 
        .show(); 
     } 
    }); 
} 
+0

它正在工作。謝謝你的回答。我在哪裏可以閱讀Handler和Android線程來理解它,就像U))? – AskQuestion 2014-11-05 11:08:26

+0

Lol ...早開心(((Afrer});解析開始和處理程序不等待AlertDialog選擇並立即開始解析。如何才能使用join()直到不選擇對話框項目? – AskQuestion 2014-11-05 11:20:00