2013-10-21 48 views
4

我有一個listview有複選框。對於每個複選框(它們大約是3),它都有一個特定的AsyncTask。AsyncTask中的Android AlertDialog

我從來不知道選擇什麼複選框的用戶,所以我不能把在異步任務AlertDialog的結束,因爲我從來不知道,如果用戶只選擇了一個複選框,或兩個或三個。

因爲AsyncTask是按步驟執行的(只有當第一個Async完成的時候是第二個開始的時候),所以我想通過AlertDialog把所有的新AsyncTask都放到最後。

private class showMessageAsync extends AsyncTask<Void, Integer, String> { 
    @Override 
    protected String doInBackground(Void... params){ 
     AlertDialog alertDialog; 
     alertDialog = new AlertDialog.Builder(getApplicationContext).create(); 
     alertDialog.setTitle("The Process"); 
     alertDialog.setIcon(R.drawable.success); 
     alertDialog.setCanceledOnTouchOutside(false); 
     alertDialog.setMessage("All done!"); 
     alertDialog.setButton(AlertDialog.BUTTON_NEUTRAL, "OK", 
           new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int which) { 
       Intent A = new Intent(DownloadActivity.this, Menu_activity.class); 
       startActivity(A); 
       finish(); 
      } 
     }); 
     alertDialog.setOnDismissListener(new DialogInterface.OnDismissListener() {   
      @Override 
      public void onDismiss(DialogInterface dialog) { 
       Intent A = new Intent(DownloadActivity.this, Menu_activity.class); 
       startActivity(A); 
       finish(); 
      } 
     }); 
     alertDialog.show(); 
     return "Executed"; 
    } 
} 

這是錯誤:

10-21 04:24:34.117: E/AndroidRuntime(1026): FATAL EXCEPTION: AsyncTask 
#4 10-21 04:24:34.117: E/AndroidRuntime(1026): java.lang.RuntimeException: An error occured while executing 
doInBackground() 10-21 04:24:34.117: E/AndroidRuntime(1026): at 
android.os.AsyncTask$3.done(AsyncTask.java:299) 10-21 04:24:34.117: 
E/AndroidRuntime(1026):  at 
java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352) 
10-21 04:24:34.117: E/AndroidRuntime(1026):  at 
java.util.concurrent.FutureTask.setException(FutureTask.java:219) 
10-21 04:24:34.117: E/AndroidRuntime(1026):  at 
java.util.concurrent.FutureTask.run(FutureTask.java:239) 10-21 
04:24:34.117: E/AndroidRuntime(1026): at 
android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 10-21 
04:24:34.117: E/AndroidRuntime(1026): at 
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080) 
10-21 04:24:34.117: E/AndroidRuntime(1026):  at 
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573) 
10-21 04:24:34.117: E/AndroidRuntime(1026):  at 
java.lang.Thread.run(Thread.java:841) 10-21 04:24:34.117: 
E/AndroidRuntime(1026): Caused by: java.lang.RuntimeException: Can't 
create handler inside thread that has not called Looper.prepare() 
10-21 04:24:34.117: E/AndroidRuntime(1026):  at 
android.os.Handler.<init>(Handler.java:197) 10-21 04:24:34.117: 
E/AndroidRuntime(1026):  at 
android.os.Handler.<init>(Handler.java:111) 10-21 04:24:34.117: 
E/AndroidRuntime(1026):  at android.app.Dialog.<init>(Dialog.java:107) 
10-21 04:24:34.117: E/AndroidRuntime(1026):  at 
android.app.AlertDialog.<init>(AlertDialog.java:114) 10-21 
04:24:34.117: E/AndroidRuntime(1026): at 
android.app.AlertDialog$Builder.create(AlertDialog.java:931) 10-21 
04:24:34.117: E/AndroidRuntime(1026): at com.example.MyExample.DownloadActivity$showMessageAsync.doInBackground(DownloadActivity.java:487) 
10-21 04:24:34.117: E/AndroidRuntime(1026): at com.example.MyExample.DownloadActivity$showMessageAsync.doInBackground(DownloadActivity.java:1) 
10-21 04:24:34.117: E/AndroidRuntime(1026):  at android.os.AsyncTask$2.call(AsyncTask.java:287) 10-21 04:24:34.117: 
E/AndroidRuntime(1026):  at java.util.concurrent.FutureTask.run(FutureTask.java:234) 10-21 
04:24:34.117: E/AndroidRuntime(1026): ... 4 more 

我打電話給我的AsyncTask這樣:

if(list.get(0).isSelected() == true){ 
    // list = class that contains checkboxs state 
    String[] params = {order, String.valueOf(limit_customers) }; 
    customers.execute(params); 
} 
if(list.get(1).isSelected() == true){ 
    String[] params = {order, String.valueOf(limit_products) }; 
    products.execute(params); 
} 
// etc, and in the end of this: 
showMessageAsync sM = new showMessageAsync(); 
sM.execute(); 

的錯誤是在這條線:

alertDialog = new AlertDialog.Builder(getApplicationContext()).create(); 

回答

21

警告對話框是前景的事情,所以它不能在異步任務的後臺方法來完成。做 通過這種方式

private class showMessageAsync extends AsyncTask<String, Void, String> { 
    AlertDialog alertDialog; 
    protected void onPreExecute() { 
    super.onPreExecute(); 
      alertDialog = new AlertDialog.Builder(YourClasss.this); 
    } 
    @Override 
    protected String doInBackground(Void... params){  
      return null; 
    } 
    @Override 
    protected void onPostExecute(String result) { 
      super.onPostExecute(result); 

      alertDialog.setTitle("The Process"); 
      alertDialog.setIcon(R.drawable.success); 
      alertDialog.setCanceledOnTouchOutside(false); 
      alertDialog.setMessage("All done!"); 
      alertDialog.setButton(AlertDialog.BUTTON_NEUTRAL, "OK", 
            new DialogInterface.OnClickListener() { 
             public void onClick(DialogInterface dialog, int which) { 
               Intent A = new Intent(DownloadActivity.this, Menu_activity.class); 
               startActivity(A); 
               finish(); 
             } 
            }); 
      alertDialog.setOnDismissListener(new DialogInterface.OnDismissListener() {   
            @Override 
            public void onDismiss(DialogInterface dialog) { 
              Intent A = new Intent(DownloadActivity.this, Menu_activity.class); 
              startActivity(A); 
              finish(); 
            } 
        }); 
      alertDialog.show(); 
    } 

} 
+0

像魅力一樣工作。謝謝。 – user2742861

2

你不能在內部調用一個警告框做一個to的inbackground method.same AST。 doinbg方法內不能執行UI操作。而是使用post執行方法,或者改變事情的方式。

+0

我應該怎麼做?我需要在所有內容結束時顯示一條消息..但我不知道用戶選擇了哪些任務。 – user2742861

+0

使用戶首先選擇項目。然後執行操作,這是你能做到的唯一方法:) –

+0

啊?這已經完成了。用戶選擇項目,任務開始。但是,如何知道哪一個是最後一個,以便您可以顯示消息? – user2742861

3

Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()

您正試圖在doInbackground內顯示lertdialog。在backgroudn線程上調用doInbackground。和ui應該在ui線程上更新。

您可以返回doInbackground中的背景計算結果並更新onPostExecute中的ui。或者使用runOnUiThread這是一種活動類的方法。或onProgressUpdate(Progress...)

http://developer.android.com/reference/android/os/AsyncTask.html

顯示對話框還要檢查Threads下的主題@http://developer.android.com/guide/components/processes-and-threads.html

當一個應用程序啓動時,系統會創建執行的應用程序的線程,稱爲「主」。此線程非常重要,因爲它負責將事件分派到相應的用戶界面小部件(包括繪圖事件)。它也是您的應用程序與來自Android UI工具包(來自android.widget和android.view包的組件)交互的線程。因此,主線程有時也被稱爲UI線程。

還可以使用活動情境

alertDialog = new AlertDialog.Builder(ActivityContext).create(); 
+0

我應該怎麼做?我需要在所有內容結束時顯示一條消息..但我不知道用戶選擇了哪些任務。 – user2742861

+0

@ user2742861使用上面提到的建議 – Raghunandan

+0

我已經知道這些事件,我確實使用它們。但看到我對Dhara Shah的第二個回答。 – user2742861

0

您可以通過功能doInBackground這裏面的方法來訪問用戶界面...:

getActivity().runOnUiThread(new Runnable() { 
    @Override 
    public void run() { 
     if (!dialog.isShowing()) { 
      dialog.show(); 
     } 
     dialog.setMessage(getText(R.string.lbl_downloading) + " : " + String.valueOf(mCount) + "/" + String.valueOf(totalItems)); 
    } 
}); 

這是剪斷從我的代碼顯示downnloaded項目採取。