我的 Android 应用程序允许用户从 Fragment 更新他们的 Facebook 状态。我已经实现了以下 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 帖子 - 我尝试使用 runnables 并记录所有正在运行的线程等,但没有任何乐趣。
提前谢谢你救了我...