Java中异步回调的处理
我的一个OpenFeint恢复排行榜数据的方法需要对一个方法进行异步回调,该方法应该修改我的一个局部变量(使用一个奇妙的技巧)。我现在的问题是,一旦调用CB,执行将继续,并且由于score值尚未更改,它将返回一个null指针。有没有办法使所有内容同步或从主函数返回回调值Java中异步回调的处理,java,android,asynchronous,openfeint,Java,Android,Asynchronous,Openfeint,我的一个OpenFeint恢复排行榜数据的方法需要对一个方法进行异步回调,该方法应该修改我的一个局部变量(使用一个奇妙的技巧)。我现在的问题是,一旦调用CB,执行将继续,并且由于score值尚未更改,它将返回一个null指针。有没有办法使所有内容同步或从主函数返回回调值 private long getScoreLeaderBoard(String idLeaderBoard) { for (Leaderboard l : OpenFeintX.leaderboards) {
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同步功能。我可能会在加载过程中得到分数,缓存新的高分,然后像你说的那样从那里使用它。