如何实例化一个新的 JSONObject Arraylist,它采用函数返回的 Arraylist 的值?
How to instantiate a new JSONObject Arraylist which takes the value of the Arraylist returned by a function?
我定义的函数 returns 一个 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;
不要在 String
上使用 .equals()
方法,而是使用 .contentEquals()
。这样做的原因是因为 contentEquals()
检查字符串的内容并将其与 StringBuffer
、StringBuilder
和 CharSequence
以及所有派生的 类 进行比较。
这就是为什么在你的情况下 adft.equals("D")
可能 return false 即使 adft 在后台:
String adft = "D";
原因是因为 equals()
只会比较 String 对象,所以所有其他对象都被认为是 not equal
并且它将 return false。
更多信息请点击此处:https://www.programmersought.com/article/2993983603/
此外,有时 returned 的值可以存储我们不需要的 space,所以在 "D"
中我们有 "D "
或 " D"
。要解决这个问题,只需使用方法 .trim()
if(adft.trim().contentEquals("D"))
您在 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
}
在 android 中点击 Api 不会立即获得 return 数据,这取决于您的反应。
您要立即 return 该列表,因此您收到一个空列表,如果您可以在 onResponse 方法中工作,那么您的问题就解决了。
我定义的函数 returns 一个 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;
不要在 String
上使用 .equals()
方法,而是使用 .contentEquals()
。这样做的原因是因为 contentEquals()
检查字符串的内容并将其与 StringBuffer
、StringBuilder
和 CharSequence
以及所有派生的 类 进行比较。
这就是为什么在你的情况下 adft.equals("D")
可能 return false 即使 adft 在后台:
String adft = "D";
原因是因为 equals()
只会比较 String 对象,所以所有其他对象都被认为是 not equal
并且它将 return false。
更多信息请点击此处:https://www.programmersought.com/article/2993983603/
此外,有时 returned 的值可以存储我们不需要的 space,所以在 "D"
中我们有 "D "
或 " D"
。要解决这个问题,只需使用方法 .trim()
if(adft.trim().contentEquals("D"))
您在 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
}
在 android 中点击 Api 不会立即获得 return 数据,这取决于您的反应。 您要立即 return 该列表,因此您收到一个空列表,如果您可以在 onResponse 方法中工作,那么您的问题就解决了。