在回调外更新变量

时间:2015-06-26 06:47:15

标签: java asynccallback

我正在使用facebook SDK for Android。我有一个请求,它从我得到响应的地方回调。我必须执行可变次数的请求,具体取决于我从请求中获得的响应。我试图在回调函数之外使用全局变量并使用响应更新它但它不起作用。以下是我如何处理它。

全局变量:

int dataLength = -1;

要继续执行请求:

while (dataLength == -1){
getComments("20");
}

问题在于,就好像dataLength永远不会被更新,尽管它应该在第一次调用时更新

请求和回调函数:

public void getComments(String offset){
GraphRequest request = GraphRequest.newGraphPathRequest(AccessToken.getCurrentAccessToken(), "/me/inbox",
                new GraphRequest.Callback() {
                    @Override
                    public void onCompleted(GraphResponse graphResponse) {
                        dataLength = graphResponse.getJSONObject().getJSONArray("data").length;
                    }
                });
Bundle parameters = new Bundle();
parameters.putString("limit", "20");
parameters.putString("offset", offset);
request.setParameters(parameters);
request.executeAsync();
}

1 个答案:

答案 0 :(得分:0)

一个问题是你的while循环和你的异步回调是在不同的线程中运行的,所以如果没有某种同步,就不能保证在另一个线程中写入的dataLength的值将在另一个线程中被读取。 (见"Memory Consistency Errors" in the Java Tutorials。)

解决该问题的最简单方法是使用volatile关键字:

private volatile int dataLength = -1;

这可确保每次dataLength的读取都将检索最新写入的值。