我的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;
}
我有兩個問題,我真的需要幫助請:
LogInAndPostToWall立即返回myFResult爲false。我希望它做的是等到webView的登錄從DialogListener返回onComplete(或一個錯誤)。我怎樣才能得到它返回myFResult在那一刻,而不是之前?
如果我包含Looper.loop(); onPostExecute永遠不會被調用。如果我不包含Looper.prepare();我得到一個錯誤,說我不能創建一個處理程序沒有它。我應該在什麼地方撥打quit()?
我一直停留在這兩天,看了很多,很多SO職位(!) - 我已經使用可運行和記錄哪些線程一切都在等運行,但沒有喜悅審判。
預先感謝你救了我......
我原本在UI線程上有loginAndPostToWall,但它會FC,因爲我在那裏用http函數運行它 - 我不得不使用StrictMode解決方法來防止這種情況,但假定Async是正確的方法? – brandall
我認爲你可以使用處理程序發佈,即使在doinbackground。只要處理程序連接到UI線程。 –
@Vladimir - 我剛剛剝離了我的代碼,並在UI線程上運行loginAndPostToWall。它沒有強迫關閉。我完全困惑......它絕對適用!令人難以置信......無論如何,我會在其他一些設備上運行它來檢查並返回,以便將您的答案標記爲正確。任何意見返回myFResult一旦onComplete已返回,將不勝感激。感謝您的回覆。 – brandall