(AsyncTask) 捕获时打开一个对话框 (Jsoup)
(AsyncTask) Open a dialog when catch (Jsoup)
我希望在“AsyncTask”为“catch”时打开对话框。我试图将对话称为“捕获”。但是程序崩溃了。遇到问题时如何打开对话框?
我的代码:
public class test extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... voids) {
try {
Document doc = (Document) Jsoup.connect("(warn: here my web)").get();
test = doc.text();
} catch (Exception e)
//Here problem dialog open. App crash
OpenDialog();
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void unused) {
super.onPostExecute(unused);
Toast.makeText(MainActivity.this, test, Toast.LENGTH_LONG).show();
}
}
logcat 错误(红色):
2021-12-17 07:22:10.953 17530-17564/? E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1
Process, PID: 17530
java.lang.RuntimeException: An error occurred while executing doInBackground()
at android.os.AsyncTask.done(AsyncTask.java:415)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:383)
at java.util.concurrent.FutureTask.setException(FutureTask.java:252)
at java.util.concurrent.FutureTask.run(FutureTask.java:271)
at android.os.AsyncTask$SerialExecutor.run(AsyncTask.java:305)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:923)
Caused by: java.lang.RuntimeException: Can't create handler inside thread Thread[AsyncTask #1,5,main] that has not called Looper.prepare()
at android.os.Handler.<init>(Handler.java:227)
at android.os.Handler.<init>(Handler.java:129)
at android.view.ViewRootImpl$ViewRootHandler.<init>(ViewRootImpl.java:5041)
at android.view.ViewRootImpl.<init>(ViewRootImpl.java:5369)
at android.view.ViewRootImpl.<init>(ViewRootImpl.java:763)
at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:399)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:111)
at android.app.Dialog.show(Dialog.java:342)
at Main.qaytaDialog(Main.java:130)
at Main.access[=11=]0(Main.java:24)
at Main$dooit.doInBackground(Main.java:95)
at Main$dooit.doInBackground(Main.java:83)
at android.os.AsyncTask.call(AsyncTask.java:394)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at android.os.AsyncTask$SerialExecutor.run(AsyncTask.java:305)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:923)
有点宽泛,但这里有一些提示。显示对话框是前台的事情(在主线程或 UI 线程上运行)所以它不能在异步任务的后台方法中完成(它在后台线程上运行)。它只允许从 onPostExecute(),onPublishProgress 等方法().
Caused by: java.lang.RuntimeException: Can't create handler inside thread Thread[AsyncTask #1,5,main] that has not called Looper.prepare()
Please refer to this link for details
这是一个快速代码片段供您参考
public class MyAsync extends AsyncTask<Void, Void, Void> {
Boolean isCatched=false;
@Override
protected Void doInBackground(Void... voids) {
try {
if (!isCatched)
throw new Exception();
Log.i("Test", "doInBackground: ");
} catch (Exception e){
//Here problem dialog open. App crash
isCatched=true;
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void unused) {
super.onPostExecute(unused);
if (isCatched)
OpenDialog();
Toast.makeText(MainActivity.this, "Done", Toast.LENGTH_LONG).show();
}
}
我希望在“AsyncTask”为“catch”时打开对话框。我试图将对话称为“捕获”。但是程序崩溃了。遇到问题时如何打开对话框?
我的代码:
public class test extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... voids) {
try {
Document doc = (Document) Jsoup.connect("(warn: here my web)").get();
test = doc.text();
} catch (Exception e)
//Here problem dialog open. App crash
OpenDialog();
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void unused) {
super.onPostExecute(unused);
Toast.makeText(MainActivity.this, test, Toast.LENGTH_LONG).show();
}
}
logcat 错误(红色):
2021-12-17 07:22:10.953 17530-17564/? E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1
Process, PID: 17530
java.lang.RuntimeException: An error occurred while executing doInBackground()
at android.os.AsyncTask.done(AsyncTask.java:415)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:383)
at java.util.concurrent.FutureTask.setException(FutureTask.java:252)
at java.util.concurrent.FutureTask.run(FutureTask.java:271)
at android.os.AsyncTask$SerialExecutor.run(AsyncTask.java:305)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:923)
Caused by: java.lang.RuntimeException: Can't create handler inside thread Thread[AsyncTask #1,5,main] that has not called Looper.prepare()
at android.os.Handler.<init>(Handler.java:227)
at android.os.Handler.<init>(Handler.java:129)
at android.view.ViewRootImpl$ViewRootHandler.<init>(ViewRootImpl.java:5041)
at android.view.ViewRootImpl.<init>(ViewRootImpl.java:5369)
at android.view.ViewRootImpl.<init>(ViewRootImpl.java:763)
at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:399)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:111)
at android.app.Dialog.show(Dialog.java:342)
at Main.qaytaDialog(Main.java:130)
at Main.access[=11=]0(Main.java:24)
at Main$dooit.doInBackground(Main.java:95)
at Main$dooit.doInBackground(Main.java:83)
at android.os.AsyncTask.call(AsyncTask.java:394)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at android.os.AsyncTask$SerialExecutor.run(AsyncTask.java:305)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:923)
有点宽泛,但这里有一些提示。显示对话框是前台的事情(在主线程或 UI 线程上运行)所以它不能在异步任务的后台方法中完成(它在后台线程上运行)。它只允许从 onPostExecute(),onPublishProgress 等方法().
Caused by: java.lang.RuntimeException: Can't create handler inside thread Thread[AsyncTask #1,5,main] that has not called Looper.prepare()
Please refer to this link for details
这是一个快速代码片段供您参考
public class MyAsync extends AsyncTask<Void, Void, Void> {
Boolean isCatched=false;
@Override
protected Void doInBackground(Void... voids) {
try {
if (!isCatched)
throw new Exception();
Log.i("Test", "doInBackground: ");
} catch (Exception e){
//Here problem dialog open. App crash
isCatched=true;
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void unused) {
super.onPostExecute(unused);
if (isCatched)
OpenDialog();
Toast.makeText(MainActivity.this, "Done", Toast.LENGTH_LONG).show();
}
}