0

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

我有两个问题,我真的需要帮助:

  1. LogInAndPostToWall 立即将 myFResult 返回为 false。我想要它做的是等到 webView 的登录从 DialogListener 返回 onComplete (或错误)。我怎样才能让它在那个时候而不是之前返回 myFResult ?

  2. 如果我包含 Looper.loop(); onPostExecute 永远不会被调用。如果我不包括 Looper.prepare(); 我收到一条错误消息,说没有它我无法创建处理程序。我应该在某处调用 quit() 吗?

我已经坚持了两天(!)并阅读了很多很多 SO 帖子 - 我尝试使用 runnables 并记录所有正在运行的线程等,但没有任何乐趣。

提前谢谢你救了我...

4

1 回答 1

1

loginAndPostToWall() 应该在 UI 线程上执行,因为它会修改 UI。doInBackgorund() 方法永远不会在 UI 线程上执行,并且您不应该在其中包含 Looper.prepare() 或 Looper.loop() 代码。

于 2012-06-01T13:37:23.397 回答