Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/178.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中异步回调的处理_Java_Android_Asynchronous_Openfeint - Fatal编程技术网

Java中异步回调的处理

Java中异步回调的处理,java,android,asynchronous,openfeint,Java,Android,Asynchronous,Openfeint,我的一个OpenFeint恢复排行榜数据的方法需要对一个方法进行异步回调,该方法应该修改我的一个局部变量(使用一个奇妙的技巧)。我现在的问题是,一旦调用CB,执行将继续,并且由于score值尚未更改,它将返回一个null指针。有没有办法使所有内容同步或从主函数返回回调值 private long getScoreLeaderBoard(String idLeaderBoard) { for (Leaderboard l : OpenFeintX.leaderboards) {

我的一个OpenFeint恢复排行榜数据的方法需要对一个方法进行异步回调,该方法应该修改我的一个局部变量(使用一个奇妙的技巧)。我现在的问题是,一旦调用CB,执行将继续,并且由于score值尚未更改,它将返回一个null指针。有没有办法使所有内容同步或从主函数返回回调值

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

回调定义:

覆盖异步任务的
onPostExecute
,并在其中执行您需要执行的操作

如果您的方法可以在异步回调执行时阻止,您可以让它创建一个
倒计时闩锁
,如下所示:

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;
    ...
}
而不是

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

private void requestScoreLeaderBoardUpdate(String idLeaderBoard) { /* takes long */ }
并将处理getScoreLeaderBoard返回值的代码放入(或从中调用其方法)
onSuccess

这样,您就不必等待并阻塞线程

您还可以让您的活动实现排行榜。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
    }
}

它没有一个:(onSuccess无法返回像getScoreboard这样的上层方法的值,这就是我使用本地vble的原因。onSuccess需要一些时间来运行,同时执行会继续并到达返回部分。这不会使我的应用程序停止一秒钟吗?我需要尽快运行此方法,因为它是游戏的一部分。if
getScoreLeaderBoard
在UI线程上执行-是的。它会等到
onSuccess
happensIt是一个答案,但它可能不会是最优的:/我会尝试一下。我尝试使用了您的想法,但使用了第二个方法参数long,这是一个正在更改的参数,但执行速度仍然太快,我得到了空值呃。它不是很快-即使异步线程只将结果写入变量,也不可能(imk_)立即得到结果。这只是因为调用
l.getUserScore
的线程一直执行,直到返回未触及的变量。(imk_)调度程序可能会停止执行调用线程,并让另一个线程在您点击
return
之前执行,但这完全取决于运气。确保不返回
null
的唯一方法是显式停止调用线程的执行(这就是
cdl.countDown()
所做的)如果这些解决方案不起作用,听起来您需要重新设计一点。如果您的本机/包装器/处理程序调用链真的需要将分数返回给它,那么您最好使用最近缓存的分数,并且希望有一种方法在异步回调执行后通知API有更新的分数如果不是的话,我会寻找其他人如何使用API的例子,或者寻找一个假的开发者论坛……OpenFeint论坛在大多数时候都像一个贫瘠的地方,我总是在询问之前用谷歌搜索答案,所以:P让我奇怪的是,以前没有这样做过,Android API也没有便利iOS拥有的nt同步功能。我可能会在加载过程中得到分数,缓存新的高分,然后像你说的那样从那里使用它。