Мое приложение для 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 есть две проблемы, которые мне действительно нужна помощь с, пожалуйста:
LogInAndPostToWall немедленно возвращает myFResult как ложь. То, что я хочу сделать, это подождать, пока логин webView не вернет onComplete (или ошибку) из DialogListener. Как я могу заставить его вернуть myFResult в этот момент, а не раньше?
Если у меня есть Looper.loop(); onPostExecute никогда не вызывается. Если я не включаю Looper.prepare(); Я получаю сообщение о том, что я не могу создать обработчик без него. Должен ли я называть quit() где-нибудь?
Я застрял на этом в течение двух дней и читал много, много SO сообщений (!) - Я попытался с помощью runnables и журналирования темы все работает на и т.д., но не радость.
Заранее спасибо за спасение меня ...
У меня первоначально был loginAndPostToWall в потоке пользовательского интерфейса, но это был бы FC, потому что я запускал его там с помощью http-функций - мне пришлось использовать обходное решение StrictMode, чтобы предотвратить это, но предположил, что Async был правильным методом? – brandall
Я думаю, вы можете использовать обработчик для публикации, даже в doinbackground. пока обработчик прикреплен к нити ui. –
@ Vladimir - Я только что удалил свой код и запустил loginAndPostToWall в потоке пользовательского интерфейса. Это не заставило близко. Я полностью озадачен ... Он определенно привык! Невероятно ... Во всяком случае, я запустил его на некоторых других устройствах, чтобы проверить и вернуться, чтобы отметить ваш ответ как правильный. Любые идеи о возврате myFResult после того, как onComplete вернулись, будут оценены. Спасибо за ваш ответ. – brandall