2011-12-13 4 views
0

У меня есть код:Как выполнить AsyncTask из метода обратного вызова?

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. Но я получаю ошибки Runtime всегда:

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) 

Я пытаюсь выполнить Looper.prepare(), но в этом случае приложение замораживания всегда. Как мне выполнить AsyncTask? Спасибо.

ответ

0

Вам необходимо выполнить команду AsyncTask из нити пользовательского интерфейса. Вы можете сделать что-то вроде этого:

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

Спасибо. Пожалуйста, не могли бы вы рассказать мне о моей ошибке? Почему он должен использовать это значение? В любом случае, спасибо. – user1078760

+0

Вероятно, вам стоит прочитать пронизывание, это сложная тема, которую я не могу описать в одном комментарии. Ключевым моментом в этой ситуации, как мы с Питером, так и мной, является то, что вам нужно вызвать 'AsyncTask' из потока пользовательского интерфейса. Если вы не понимаете, что это значит, вам нужно будет много изучать, что, вероятно, должно включать [this] (http://developer.android.com/guide/topics/fundamentals/processes-and-threads. html # Threads) doc. – kabuko

+0

Большое спасибо. – user1078760

0

Вы должны позвонить asyncTask.execute() в свою основную (UI) нить.

Смежные вопросы