3

我的一个恢复排行榜数据的 OpenFeint 方法需要一个异步回调到一个应该修改我的一个局部变量的方法(使用一个很棒的 hack)。我现在的问题是,一旦调用了 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

如果你的方法可以在异步回调执行时被阻塞,你可以让它创建一个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 回答
0

覆盖onPostExecuteAsyncTask 并在那里做你需要做的事情

于 2012-04-27T14:06:09.447 回答
0

代替

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

做了

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

并将处理 getScoreLeaderBoard 的返回值的代码放入(或从中调用它的方法)onSuccess

这样你就不必等待和阻塞你的线程。

您也可以让您的 Activity 实现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 回答