2012-06-01 2 views
0

Мое приложение для Android позволяет пользователям обновлять свой статус Facebook из фрагмента. Я реализовал следующую AsyncTask, чтобы они могли войти:onPostExecute Looper AsyncTask

public class updateFacebookTask extends AsyncTask<String, Void, Boolean> { 
    protected Boolean doInBackground(final String... message) { 
     Log.i(TAG, "Async UFT"); 

     myFResult = false; 

      Looper.prepare(); 

      if (loginAndPostToWall()) { 
       Log.i(TAG, "loginAndPostToWall Returned: " + myFResult); 

       myFResult = true; 

      } else { 
       Log.i(TAG, "loginAndPostToWall Returned: " + myFResult); 

       myFResult = false; 
      } 


      //Looper.loop(); 


     return myFResult; 
    } 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 

     Log.i(TAG, "UFT - oPrE"); 

    } 
    @Override 
    protected void onPostExecute(Boolean myFResult) { 
     super.onPostExecute(myFResult); 

     if (myFResult) { 
      Log.i(TAG, "UFT oPE - Success: " + myFResult); 


     } else { 
      Log.w(TAG, "UFT oPE - fail: " + myFResult); 

     } 
    } 

AsyncTask использует метод loginAndPostToWall(), как показано ниже, реализующий DialogListener как часть SDK Facebook:

public boolean loginAndPostToWall() { 

    myFResult = false; 

    facebook.authorize(getActivity(), PERMISSIONS, 
      Facebook.FORCE_DIALOG_AUTH, new DialogListener() { 

       public void onComplete(Bundle values) { 
        Log.i(TAG, "LoginDialog Complete - Success"); 


        myFResult = true; 


       } 

       public void onFacebookError(FacebookError error) { 
        Log.w(TAG, 
          "onFacebookError - Authentication with Facebook failed"); 


        myFResult = false; 

       } 

       public void onError(DialogError error) { 
        Log.w(TAG, 
          "onError - Authentication with Facebook failed"); 
        looper = false; 
        Log.i(TAG, "looper " + looper); 

        myFResult = false; 

       } 

       public void onCancel() { 
        Log.w(TAG, 
          "onCancel - Authentication with Facebook cancelled"); 


        myFResult = false; 

       } 
      }); 


    return myFResult; 
} 

I есть две проблемы, которые мне действительно нужна помощь с, пожалуйста:

  1. LogInAndPostToWall немедленно возвращает myFResult как ложь. То, что я хочу сделать, это подождать, пока логин webView не вернет onComplete (или ошибку) из DialogListener. Как я могу заставить его вернуть myFResult в этот момент, а не раньше?

  2. Если у меня есть Looper.loop(); onPostExecute никогда не вызывается. Если я не включаю Looper.prepare(); Я получаю сообщение о том, что я не могу создать обработчик без него. Должен ли я называть quit() где-нибудь?

Я застрял на этом в течение двух дней и читал много, много SO сообщений (!) - Я попытался с помощью runnables и журналирования темы все работает на и т.д., но не радость.

Заранее спасибо за спасение меня ...

ответ

1

loginAndPostToWall() должен быть выполнен в потоке пользовательского интерфейса, как это modifyes интерфейса. Метод doInBackgorund() никогда не выполнялся в потоке пользовательского интерфейса, и вы никогда не должны включать туда код Looper.prepare() или Looper.loop().

+0

У меня первоначально был loginAndPostToWall в потоке пользовательского интерфейса, но это был бы FC, потому что я запускал его там с помощью http-функций - мне пришлось использовать обходное решение StrictMode, чтобы предотвратить это, но предположил, что Async был правильным методом? – brandall

+0

Я думаю, вы можете использовать обработчик для публикации, даже в doinbackground. пока обработчик прикреплен к нити ui. –

+0

@ Vladimir - Я только что удалил свой код и запустил loginAndPostToWall в потоке пользовательского интерфейса. Это не заставило близко. Я полностью озадачен ... Он определенно привык! Невероятно ... Во всяком случае, я запустил его на некоторых других устройствах, чтобы проверить и вернуться, чтобы отметить ваш ответ как правильный. Любые идеи о возврате myFResult после того, как onComplete вернулись, будут оценены. Спасибо за ваш ответ. – brandall

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