问题描述
我定义的函数返回一个 JSONObejct Arraylist,但是,当我实例化一个新的 Arraylist 到函数的输出时,它显示一个空的 Arraylist。我该如何解决这个问题?为什么它在函数中确实返回了一个 Arraylist 时却显示一个空的数组列表?
代码如下:
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;
解决方法
不要在 .equals()
上使用 String
方法,而是使用 .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"))
,
在 android 中点击 Api 不会立即返回数据,这取决于您的响应。 您将立即返回列表,以便您收到一个空列表,如果您可以在 onResponse 方法中工作,那么您的问题就解决了。
,您在将 API 加入队列后立即返回列表。您的 ArrayList 在 API 请求成功后填充,因此您必须创建 ArrayList 全局并在 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
}