我有一个带有复选框的列表视图。对于每个复选框(大约有3个),它都有一个特定的AsyncTask。
我从来不知道用户选择了什么复选框,所以我不能把AlertDialog放在异步任务的末尾,因为我从来不知道用户是只选择了一个复选框,还是两个或三个。
因为AsyncTask是分步执行的(只有当第一个Async任务完成时,第二个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
我这样称呼我的异步任务:
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();
不能在do inbackground方法中调用警告框。toast也是如此。在doinbg方法中不能执行任何UI操作。相反,使用post execute方法,或者改变必须完成的事情的方式。
原因:Java . lang . runtime异常:无法在未调用Looper.prepare()的线程内创建处理程序
您正在尝试在doInbackground
中显示一个lertdialog。doInbackground
在backgroudn线程上调用。并且 UI 应在 UI 线程上更新。
您可以在doInbackground
中返回后台计算的结果,并在onPostExecte
中更新用户界面。或者使用runOnUiThread
这是活动类的一种方法。或者在onProgresUpdate(进度…)
中显示对话框
http://developer.android.com/reference/android/os/AsyncTask.html
另请查看< code > Threads @ http://developer . Android . com/guide/components/processes-and-Threads . html下的主题
当应用程序启动时,系统会为应用程序创建一个执行线程,称为“main”。该线程非常重要,因为它负责将事件分派到适当的用户界面小部件,包括绘图事件。它也是应用程序与Android UI工具包中的组件(Android.widget和Android.view包中的组件)交互的线程。因此,主线程有时也称为UI线程。
同时使用活动上下文
alertDialog = new AlertDialog.Builder(ActivityContext).create();
警报对话框是前台的东西,所以它不能在异步任务的后台方法中完成。用这种方式做
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();
}
}
有没有一种方法我可以做类似以下的事情?:
本文向大家介绍spring boot中使用@Async实现异步调用任务,包括了spring boot中使用@Async实现异步调用任务的使用技巧和注意事项,需要的朋友参考一下 什么是“异步调用”? “异步调用”对应的是“同步调用”,同步调用指程序按照定义顺序依次执行,每一行程序都必须等待上一行程序执行完成之后才能执行;异步调用指程序在顺序执行时,不等待异步调用的语句返回结果就执行后面的程序。 同
本文向大家介绍Spring Boot Async异步执行任务过程详解,包括了Spring Boot Async异步执行任务过程详解的使用技巧和注意事项,需要的朋友参考一下 异步调用就是不用等待结果的返回就执行后面的逻辑,同步调用则需要等带结果再执行后面的逻辑。 通常我们使用异步操作都会去创建一个线程执行一段逻辑,然后把这个线程丢到线程池中去执行,代码如下: 这样的方式看起来没那么优雅,尽管用了ja
独立的Spring Boot应用程序中的注释类中的方法不能异步运行。我做错了什么?
我在用Gradle。我有两个任务:“A”和“B”。我想让任务“A”调用任务“B”。我怎么能这么做? 是否可以简单地从现有任务中调用另一个任务?
问题内容: 我有一些我想在JS中做的资源密集型任务。对于这个问题,让我们假设它们是一些繁重的计算,而不是系统访问。现在,我想同时运行任务A,B和C,并在完成后执行一些功能D。 该异步库为此提供了一个很好的脚手架: 如果我正在做的只是计算,那么它将仍然同步运行(除非库将任务本身放在不同的线程上,我希望情况并非如此)。我如何使它实际上是平行的?异步代码通常不阻止调用者的事情是什么(使用NodeJS时)