gpt4 book ai didi

java - 保持 onResponse 方法中获得的数据在整个类中可用

转载 作者:行者123 更新时间:2023-12-01 09:08:30 26 4
gpt4 key购买 nike

基本上在我的Android应用程序中,我希望用户搜索世界各地的城市,因此我使用API​​来获取世界上所有的城市并将其存储在ArrayList中,这是在okhttp 库的 onResponse 方法,之后列表变为空。该数组列表仅在 onResponse 中保存值,但我想在执行后在整个类中使用它。谁能给我任何想法吗?这是代码。

onCreate(){
OkHttpClient client = new OkHttpClient();
final Request request = new Request.Builder()
.url("https://raw.githubusercontent.com/David-Haim/CountriesToCitiesJSON/master/countriesToCities.json")
.build();
Call call = client.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Request request, IOException e) {

}

@Override
public void onResponse(Response response) throws IOException {
try {
fullObject = new JSONObject(response.body().string());
JSONArray s = fullObject.names();
for(int i=0; i<s.length(); i++) {
JSONArray citiesOfOneCoutry = null;
citiesOfOneCoutry = fullObject.getJSONArray(s.getString(i));
for(int j=0; j<citiesOfOneCoutry.length();j++) {
allCities.add(citiesOfOneCoutry.getString(j));
}
Log.d(TAG, "onResponse: in for "+allCities.size());
}
Log.d(TAG, "onResponse: outside for "+allCities.size()); //gives full size.
} catch (JSONException e) {
e.printStackTrace();
}
Log.d(TAG, "onResponse: outside try "+allCities.size()); //gives full size
}
});

Log.d(TAG, "outside response inside oncreate"+allCities.size()); //gives 0

}

我在日志中看到来自外部 onResponse 的消息是第一个,然后是回调被执行。这是很容易理解的,但我想要在响应执行后获取这个 ArrayList 的技巧。

最佳答案

这就是异步操作的本质,它们不会按照您编写的顺序完成。 allCities 数据在您的 onCreate 方法中不可用,因为它还没有机会执行。在 onResponse 之外使用它的技巧是将依赖于响应的代码移至其自己的方法。

private void updateUI() {
// Your code that relies on 'allCities'
}

然后在 onResponse 中,在填充 allCities 后调用 updateUI(或任何您所称的名称) --

@Override
public void onResponse(Response response) throws IOException {
try {
fullObject = new JSONObject(response.body().string());
JSONArray s = fullObject.names();
for(int i=0; i<s.length(); i++) {
JSONArray citiesOfOneCoutry = null;
citiesOfOneCoutry = fullObject.getJSONArray(s.getString(i));
for(int j=0; j<citiesOfOneCoutry.length();j++) {
allCities.add(citiesOfOneCoutry.getString(j));
}
Log.d(TAG, "onResponse: in for "+allCities.size());
}
Log.d(TAG, "onResponse: outside for "+allCities.size()); //gives full size.
} catch (JSONException e) {
e.printStackTrace();
}
Log.d(TAG, "onResponse: outside try "+allCities.size()); //gives full size
updateUI();
}

关于java - 保持 onResponse 方法中获得的数据在整个类中可用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41070937/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com