处理Java中的异步回调

时间:2012-04-27 14:01:24

标签: java android asynchronous openfeint

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

3 个答案:

答案 0 :(得分:0)

覆盖AsyncTask的onPostExecute并执行你需要做的事情

答案 1 :(得分: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;
    ...
}

答案 2 :(得分:0)

而不是

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

制作

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

并将处理getScoreLeaderBoard的returnvalue的代码放入(或调用它的方法)onSuccess

这样你就不必等待并阻止你的线程了。

你也可以让你的活动实施Leaderboard.GetUserScoreCB,然后就像拥有另一个onCreateonClick,...之类的方法。

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