2012-06-01 148 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作爲Facebook的SDK的一部分:

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; 
} 

我有兩個問題,我真的需要幫助請:

  1. LogInAndPostToWall立即返回myFResult爲false。我希望它做的是等到webView的登錄從DialogListener返回onComplete(或一個錯誤)。我怎樣才能得到它返回myFResult在那一刻,而不是之前?

  2. 如果我包含Looper.loop(); onPostExecute永遠不會被調用。如果我不包含Looper.prepare();我得到一個錯誤,說我不能創建一個處理程序沒有它。我應該在什麼地方撥打quit()?

我一直停留在這兩天,看了很多,很多SO職位(!) - 我已經使用可運行和記錄哪些線程一切都在等運行,但沒有喜悅審判。

預先感謝你救了我......

回答

1

loginAndPostToWall()應該在UI線程上執行,因爲它modifyes的UI。 doInBackgorund()方法從未在UI線程上執行過,並且不應該在其中包含Looper.prepare()或Looper.loop()代碼。

+0

我原本在UI線程上有loginAndPostToWall,但它會FC,因爲我在那裏用http函數運行它 - 我不得不使用StrictMode解決方法來防止這種情況,但假定Async是正確的方法? – brandall

+0

我認爲你可以使用處理程序發佈,即使在doinbackground。只要處理程序連接到UI線程。 –

+0

@Vladimir - 我剛剛剝離了我的代碼,並在UI線程上運行loginAndPostToWall。它沒有強迫關閉。我完全困惑......它絕對適用!令人難以置信......無論如何,我會在其他一些設備上運行它來檢查並返回,以便將您的答案標記爲正確。任何意見返回myFResult一旦onComplete已返回,將不勝感激。感謝您的回覆。 – brandall