2013-10-21 49 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项目采取。