Android Twitter asyncTask "не могу создать обработчик ..." ошибка - PullRequest
0 голосов
/ 24 августа 2011

у меня есть активность

, которая вызывает асинхронную задачу для настройки классов Twitter, предоставляемых через twitter4j.

Но я получаю сообщение об ошибке "не могу создать обработчик внутри потока, который не вызвал looper.prepare" который начинается с класса TwitterApp, где есть обработчик ...

как я могу обойти это? успешно настроил класс no в главном потоке пользовательского интерфейса, как раньше (что работало отлично, но замедляло работу приложения);

Я в основном делаю:

new SetUpAsyncTaskt (). Execute ();

внутри асинхронной задачи все, что я делаю, это:

TwitterApp mTwitter;
postToTwitter = true;
String twitter_consumer_key="bllaalaa";
String twitter_secret_key="blaa"



private class SetUpAsyncTask extends AsyncTask<Void, Void, Void> {


    @Override
    protected Void doInBackground(Void... params) {



        mTwitter = new TwitterApp(context, twitter_consumer_key,twitter_secret_key);

        mTwitter.setListener(mTwLoginDialogListener);

        return null;
    }

    @Override
    protected void onPostExecute(Void result) {



        if(!mTwitter.hasAccessToken()){
            postToTwitter=false;
        }
    }
}

Спасибо за любую помощь!

ОБНОВЛЕНИЕ: После выполнения большего тестирования, кажется, что проблема связана с контекстом, как будто я удаляю все данные на основе контекста в классе, который он работает, но я не получаю, если я передаю контекст из потока пользовательского интерфейса , это все еще происходит ?? : S

ОБНОВЛЕНИЕ 2: Нашел другой способ, спасибо всем, кто ответил.

Ответы [ 2 ]

1 голос
/ 24 августа 2011

Ищите здесь документацию: http://developer.android.com/reference/android/os/AsyncTask.html

некоторые правила:

  1. Экземпляр задачи должен быть создан в потоке пользовательского интерфейса.
  2. execute (Params ...) должен быть вызван в потоке пользовательского интерфейса.

Я предполагаю, что вы выполняете задачу в каком-то другом потоке.Чтобы выполнить его в потоке пользовательского интерфейса, создайте обработчик в onCreate и:

mHandler.post(new Runnable(){
  //insert task creation & execution here 
  });

Таким образом, результат, находящийся в onPostExecute, будет также возвращен в потоке пользовательского интерфейса.

0 голосов
/ 24 августа 2011

Вы можете использовать runOnUiThread () для запуска задачи без пользовательского интерфейса на пользовательском интерфейсе,

Попробуйте это,

@Override
    protected Void doInBackground(Void... params) {

mTwitter = new TwitterApp(context, twitter_consumer_key,twitter_secret_key);
Activity_name.this.runOnUiThread(new Runnable() {

          @Override
          public void run() {
        mTwitter.setListener(mTwLoginDialogListener);
          }
       });
        return null;
    }
...