如何实例化一个新的JSONObject数组列表,它需要一个函数返回的数组列表的值?



我定义的函数返回一个jsonobject数组列表,但是,当我将一个新的数组列表实例化到函数的输出时,它显示一个空数组列表。我怎么能解决这个问题,为什么它显示一个空数组列表,当它确实返回一个数组列表在函数?

代码如下:


protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activty_departures);
departure_flights = doGetRequest();
}
//my function
private ArrayList<JSONObject> doGetRequest() {
OkHttpClient client = new OkHttpClient();
ArrayList<JSONObject> departureObject = new ArrayList<>();
String url = "http_url";
Request request = new Request.Builder().url(url).build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
e.printStackTrace();
}
@Override
public void onResponse(Call call, Response response) throws IOException {
if(response.isSuccessful()) {
try {
String jsonData = response.body().string();
JSONObject Jobject = new JSONObject(jsonData);
JSONArray jarray = Jobject.getJSONArray("Flights");
for (int i = 0; i < jarray.length(); i++) {
JSONObject object = jarray.getJSONObject(i);
String adft = object.getString("Adft");
if (adft.equals("D")) {
departureObject.add(object);
}
}

} catch (Exception e) {
e.printStackTrace();
}
}
}
});
return departureObject;

android中的hit Api不会立即返回数据,这取决于您的响应。如果你能在onResponse方法中工作,那么你的问题就解决了。

String上不要使用.equals()方法,而要使用.contentEquals()方法。这样做的原因是因为contentEquals()检查字符串的内容,并将其与StringBuffer,StringBuilderCharSequence以及这些的所有派生类进行比较。

这就是为什么在你的情况下adft.equals("D")可以返回false,即使adft是在后台这:

String adft = "D";

这样做的原因是因为equals()只比较String对象,所以所有其他对象都被认为是not equal,它将返回false。

更多信息在这里:https://www.programmersought.com/article/2993983603/

而且,有时返回值可以存储我们不需要的空间,所以我们用"D "" D"代替"D"。要解决这个问题,只需使用方法.trim()

if(adft.trim().contentEquals("D"))

在API排队后立即返回列表。你的数组列表在API请求成功后填充,所以你必须创建全局数组列表并在onSuccess后填充。然后创建另一个方法在UI上呈现数据。如下所示:

ArrayList<JSONObject> departureObject = new ArrayList<>();
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activty_departures);
doGetRequest();
}
private void doGetRequest() {
OkHttpClient client = new OkHttpClient();
String url = "http_url";
Request request = new Request.Builder().url(url).build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
e.printStackTrace();
}
@Override
public void onResponse(Call call, Response response) throws IOException {
if(response.isSuccessful()) {
try {
String jsonData = response.body().string();
JSONObject Jobject = new JSONObject(jsonData);
JSONArray jarray = Jobject.getJSONArray("Flights");
for (int i = 0; i < jarray.length(); i++) {
JSONObject object = jarray.getJSONObject(i);
String adft = object.getString("Adft");
if (adft.equals("D")) {
departureObject.add(object);
}
}

reloadData();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}); 
}
private void reloadData() {
// here your data is ready
}

最新更新