我的一个恢复排行榜数据的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
答案 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
,然后就像拥有另一个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
}
}