Java 如何从回调方法执行AsyncTask?

Java 如何从回调方法执行AsyncTask?,java,android,Java,Android,我有一个密码: private void submitExec() { if (SQLiteDbWrapper.getInstance().getBookCount()==0) { Toast.makeText(this, "A list of books is empty", Toast.LENGTH_LONG).show(); return; } SQLiteDbWrapper.getInstance().makeFacebook

我有一个密码:

private void submitExec() {

    if (SQLiteDbWrapper.getInstance().getBookCount()==0) {

        Toast.makeText(this, "A list of books is empty", Toast.LENGTH_LONG).show();
        return;
    }

    SQLiteDbWrapper.getInstance().makeFacebook(this, this.getApplicationContext());
    if (SQLiteDbWrapper.getInstance().getConnector().getFacebook().isSessionValid()) {
        new SubmitClass().execute();
    }
    else {

        SessionEvents.AuthListener listener = new SessionEvents.AuthListener() {

            @Override
            public void onAuthSucceed() {
                MyBookDroidActivity.this.executeSubmitClass();
            }

            @Override
            public void onAuthFail(String error) {

            }
        };
        SessionEvents.addAuthListener(listener);
        SQLiteDbWrapper.getInstance().getConnector().login();
    }
}

private void executeSubmitClass() {

    new SubmitClass().execute();
}
此代码由Facebook授权并执行AsyncTask。但我总是遇到运行时错误:

12-13 21:58:41.513: E/AndroidRuntime(31961): Uncaught handler: thread Thread-25 exiting due to uncaught exception
12-13 21:58:41.523: E/AndroidRuntime(31961): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
12-13 21:58:41.523: E/AndroidRuntime(31961):    at android.os.Handler.<init>(Handler.java:121)
12-13 21:58:41.523: E/AndroidRuntime(31961):    at android.app.Dialog.<init>(Dialog.java:105)
12-13 21:58:41.523: E/AndroidRuntime(31961):    at android.app.AlertDialog.<init>(AlertDialog.java:63)
12-13 21:58:41.523: E/AndroidRuntime(31961):    at android.app.ProgressDialog.<init>(ProgressDialog.java:80)
12-13 21:58:41.523: E/AndroidRuntime(31961):    at android.app.ProgressDialog.<init>(ProgressDialog.java:76)
12-13 21:58:41.523: E/AndroidRuntime(31961):    at com.nda.mybookdroid.MyBookDroidActivity$SubmitClass.onPreExecute(MyBookDroidActivity.java:115)
12-13 21:58:41.523: E/AndroidRuntime(31961):    at android.os.AsyncTask.execute(AsyncTask.java:391)
12-13 21:58:41.523: E/AndroidRuntime(31961):    at com.nda.mybookdroid.MyBookDroidActivity.executeSubmitClass(MyBookDroidActivity.java:101)
12-13 21:58:41.523: E/AndroidRuntime(31961):    at com.nda.mybookdroid.MyBookDroidActivity.access$0(MyBookDroidActivity.java:99)
12-13 21:58:41.523: E/AndroidRuntime(31961):    at com.nda.mybookdroid.MyBookDroidActivity$1.onAuthSucceed(MyBookDroidActivity.java:86)
12-13 21:58:41.523: E/AndroidRuntime(31961):    at com.nda.facebook.SessionEvents.onLoginSuccess(SessionEvents.java:78)
12-13 21:58:41.523: E/AndroidRuntime(31961):    at com.nda.facebook.FacebookConnector$IDRequestListener.onComplete(FacebookConnector.java:141)
12-13 21:58:41.523: E/AndroidRuntime(31961):    at com.facebook.android.AsyncFacebookRunner$2.run(AsyncFacebookRunner.java:254)
12-13 22:01:47.193: E/AndroidRuntime(32216): Uncaught handler: thread Thread-32 exiting due to uncaught exception
12-13 22:01:47.203: E/AndroidRuntime(32216): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
12-13 22:01:47.203: E/AndroidRuntime(32216):    at android.os.Handler.<init>(Handler.java:121)
12-13 22:01:47.203: E/AndroidRuntime(32216):    at android.app.Dialog.<init>(Dialog.java:105)
12-13 22:01:47.203: E/AndroidRuntime(32216):    at android.app.AlertDialog.<init>(AlertDialog.java:63)
12-13 22:01:47.203: E/AndroidRuntime(32216):    at android.app.ProgressDialog.<init>(ProgressDialog.java:80)
12-13 22:01:47.203: E/AndroidRuntime(32216):    at android.app.ProgressDialog.<init>(ProgressDialog.java:76)
12-13 22:01:47.203: E/AndroidRuntime(32216):    at com.nda.mybookdroid.MyBookDroidActivity$SubmitClass.onPreExecute(MyBookDroidActivity.java:115)
12-13 22:01:47.203: E/AndroidRuntime(32216):    at android.os.AsyncTask.execute(AsyncTask.java:391)
12-13 22:01:47.203: E/AndroidRuntime(32216):    at com.nda.mybookdroid.MyBookDroidActivity.executeSubmitClass(MyBookDroidActivity.java:101)
12-13 22:01:47.203: E/AndroidRuntime(32216):    at com.nda.mybookdroid.MyBookDroidActivity.access$0(MyBookDroidActivity.java:99)
12-13 22:01:47.203: E/AndroidRuntime(32216):    at com.nda.mybookdroid.MyBookDroidActivity$1.onAuthSucceed(MyBookDroidActivity.java:86)
12-13 22:01:47.203: E/AndroidRuntime(32216):    at com.nda.facebook.SessionEvents.onLoginSuccess(SessionEvents.java:78)
12-13 22:01:47.203: E/AndroidRuntime(32216):    at com.nda.facebook.FacebookConnector$IDRequestListener.onComplete(FacebookConnector.java:141)
12-13 22:01:47.203: E/AndroidRuntime(32216):    at com.facebook.android.AsyncFacebookRunner$2.run(AsyncFacebookRunner.java:254)
12-13 21:58:41.513:E/AndroidRuntime(31961):未捕获处理程序:由于未捕获异常,线程线程-25正在退出
12-13 21:58:41.523:E/AndroidRuntime(31961):java.lang.RuntimeException:无法在未调用Looper.prepare()的线程内创建处理程序
12-13 21:58:41.523:E/AndroidRuntime(31961):在android.os.Handler.(Handler.java:121)
12-13 21:58:41.523:E/AndroidRuntime(31961):在android.app.Dialog.(Dialog.java:105)
12-13 21:58:41.523:E/AndroidRuntime(31961):在android.app.AlertDialog.(AlertDialog.java:63)
12-13 21:58:41.523:E/AndroidRuntime(31961):在android.app.ProgressDialog.(ProgressDialog.java:80)
12-13 21:58:41.523:E/AndroidRuntime(31961):在android.app.ProgressDialog.(ProgressDialog.java:76)
12-13 21:58:41.523:E/AndroidRuntime(31961):在com.nda.mybookdroid.MyBookDroidActivity$SubmitClass.onPreExecute(MyBookDroidActivity.java:115)
12-13 21:58:41.523:E/AndroidRuntime(31961):在android.os.AsyncTask.execute(AsyncTask.java:391)
12-13 21:58:41.523:E/AndroidRuntime(31961):在com.nda.mybookdroid.MyBookDroidActivity.executeSubmitClass(MyBookDroidActivity.java:101)
12-13 21:58:41.523:E/AndroidRuntime(31961):在com.nda.mybookdroid.MyBookDroidActivity.access$0(MyBookDroidActivity.java:99)
12-13 21:58:41.523:E/AndroidRuntime(31961):在com.nda.mybookdroid.MyBookDroidActivity$1.onAuthSuccess(MyBookDroidActivity.java:86)
12-13 21:58:41.523:E/AndroidRuntime(31961):在com.nda.facebook.SessionEvents.onloginsucess(SessionEvents.java:78)
12-13 21:58:41.523:E/AndroidRuntime(31961):在com.nda.facebook.FacebookConnector$IDRequestListener.onComplete(FacebookConnector.java:141)
12-13 21:58:41.523:E/AndroidRuntime(31961):在com.facebook.android.AsyncFacebookRunner$2.run(AsyncFacebookRunner.java:254)
12-13 22:01:47.193:E/AndroidRuntime(32216):未捕获处理程序:由于未捕获异常,线程32正在退出
12-13 22:01:47.203:E/AndroidRuntime(32216):java.lang.RuntimeException:无法在未调用Looper.prepare()的线程内创建处理程序
12-13 22:01:47.203:E/AndroidRuntime(32216):位于android.os.Handler.(Handler.java:121)
12-13 22:01:47.203:E/AndroidRuntime(32216):在android.app.Dialog(Dialog.java:105)上
12-13 22:01:47.203:E/AndroidRuntime(32216):在android.app.AlertDialog.(AlertDialog.java:63)
12-13 22:01:47.203:E/AndroidRuntime(32216):在android.app.ProgressDialog.(ProgressDialog.java:80)
12-13 22:01:47.203:E/AndroidRuntime(32216):在android.app.ProgressDialog.(ProgressDialog.java:76)
12-13 22:01:47.203:E/AndroidRuntime(32216):在com.nda.mybookdroid.MyBookDroidActivity$SubmitClass.onPreExecute(MyBookDroidActivity.java:115)
12-13 22:01:47.203:E/AndroidRuntime(32216):在android.os.AsyncTask.execute(AsyncTask.java:391)
12-13 22:01:47.203:E/AndroidRuntime(32216):在com.nda.mybookdroid.MyBookDroidActivity.executeSubmitClass(MyBookDroidActivity.java:101)
12-13 22:01:47.203:E/AndroidRuntime(32216):在com.nda.mybookdroid.MyBookDroidActivity.access$0(MyBookDroidActivity.java:99)
12-13 22:01:47.203:E/AndroidRuntime(32216):在com.nda.mybookdroid.MyBookDroidActivity$1.onAuthSucceed(MyBookDroidActivity.java:86)
12-13 22:01:47.203:E/AndroidRuntime(32216):在com.nda.facebook.SessionEvents.onLoginSAccess(SessionEvents.java:78)
12-13 22:01:47.203:E/AndroidRuntime(32216):在com.nda.facebook.facebook连接器$IDRequestListener.onComplete上(facebook连接器.java:141)
12-13 22:01:47.203:E/AndroidRuntime(32216):在com.facebook.android.AsyncFacebookRunner$2.run(AsyncFacebookRunner.java:254)

我尝试执行Looper.prepare(),但在这种情况下,应用程序总是冻结。我应该如何执行异步任务?多谢各位

您必须在主(UI)线程上调用
asyncTask.execute()

您需要从UI线程执行
asyncTask
。你可以这样做:

private void executeSubmitClass() {
    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            new SubmitClass().execute();
        }
    });
}

非常感谢。请你描述一下我的错误好吗?为什么要用这个意思呢??无论如何,谢谢你。你可能应该仔细阅读线程,这是一个复杂的话题,我无法在一篇评论中涵盖。正如Peter和我所指出的,这种情况下的关键点是需要从UI线程调用
AsyncTask
。如果你不明白这意味着什么,你将不得不做大量的研究,其中可能包括博士。