3

リーダーボード データを回復するための OpenFeint メソッドの 1 つは、(素晴らしいハックを使用して) ローカル変数の 1 つを変更するメソッドへの非同期コールバックを必要とします。私の問題は、CB が呼び出されると実行が続行され、スコア値がまだ変更されていないため、nullPointer が返されることです。すべてを同期させるか、メイン関数からコールバック値を返す方法はありますか?

private long getScoreLeaderBoard(String idLeaderBoard) {
    for (Leaderboard l : OpenFeintX.leaderboards) {
        if (l.name == null)
            break;
        if (l.resourceID().equalsIgnoreCase(idLeaderBoard)) {
            final Score s[] = new Score[1];
            l.getUserScore(OpenFeint.getCurrentUser(),
                    new Leaderboard.GetUserScoreCB() {

                        @Override
                        public void onSuccess(Score score) {
                            s[0] = score;
                        }
                    });
            if (s[0] != null) // If user has no score onSuccess get a null
                return s[0].score;
            else
                return 0;
        }
    }

    return 0;
}

コールバック定義: http://m.the9.com/ioshelp/Android_en/doc/com/openfeint/api/resource/Leaderboard.GetUserScoreCB.html

4

3 に答える 3

0

それ以外の

private long getScoreLeaderBoard(String idLeaderBoard) { /* takes long */ }

成功する

private void requestScoreLeaderBoardUpdate(String idLeaderBoard) { /* takes long */ }

getScoreLeaderBoardの戻り値を処理するコードをに入れます(またはそのメソッドを呼び出します)onSuccess

そうすれば、スレッドを待ってブロックする必要がありません。

アクティビティを実装させることもできます。Leaderboard.GetUserScoreCBそうすれば、別の、、onCreate...onClickのようなメソッドを使用するようなものになります。

class MyActivity extends Activity implements Leaderboard.GetUserScoreCB {

    private void requestScoreLeaderBoardUpdate(String idLeaderBoard) {
        // ..
        l.getUserScore(OpenFeint.getCurrentUser(), this /* your activity */);
    }

    @Override
    public void onSuccess(Score score) {
        s[0] = score;
        // do anything you want with the new score here
    }
}
于 2012-04-27T14:23:10.107 に答える
0

AsyncTask をオーバーライドしonPostExecute、そこで必要なことを行います

于 2012-04-27T14:06:09.447 に答える
0

非同期コールバックの実行中にメソッドがブロックされる可能性がある場合は、次のCountDownLatchように作成できます。

private long getScoreLeaderBoard(String idLeaderBoard) {
    final CountDownLatch cdl = new CountDownLatch(1);
    ...
                    @Override
                    public void onSuccess(Score score) {
                        s[0] = score;
                        cdl.countDown();
                    }
    ...
        cdl.await();
        return s[0].score;
    ...
}
于 2012-04-27T14:07:10.480 に答える