我定义的函数返回一个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
,StringBuilder
和CharSequence
以及这些的所有派生类进行比较。
这就是为什么在你的情况下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
}