(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 线程上运行)所以它不能在异步任务的后台方法中完成(它在后台线程上运行)。它只允许从 on​​PostExecute(),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();
}

}