0

私のAndroidアプリケーションでは、ユーザーはフラグメントから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()を使用します。これは、FacebookSDKの一部としてDialogListenerを実装します。

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

私は本当に助けが必要な2つの問題があります:

  1. LogInAndPostToWallは、すぐにmyFResultをfalseとして返します。私がやりたいのは、webViewによるログインがDialogListenerからonComplete(またはエラー)を返すまで待つことです。以前ではなく、その時点でmyFResultを返すようにするにはどうすればよいですか?

  2. Looper.loop();を含めると onPostExecuteが呼び出されることはありません。Looper.prepare();を含めない場合。それなしではハンドラーを作成できないというエラーが表示されます。どこかでquit()を呼び出すことになっていますか?

私はこれに2日間(!)立ち往生していて、たくさんのSO投稿を読んでいます-ランナブルを使用して、すべてが実行されているスレッドなどをログに記録しようとしましたが、喜びはありません。

私を救ってくれてありがとう...

4

1 に答える 1

1

loginAndPostToWall()は、UIを変更するため、UIスレッドで実行する必要があります。doInBackgorund()メソッドがUIスレッドで実行されることはなく、Looper.prepare()またはLooper.loop()コードをそこに含めないでください。

于 2012-06-01T13:37:23.397 に答える