如何实例化一个新的 JSONObject Arraylist,它采用函数返回的 Arraylist 的值?

问题描述

我定义的函数返回一个 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() 检查字符串的内容并将其与 StringBufferStringBuilderCharSequence 以及它们的所有派生类进行比较。

这就是为什么在您的情况下 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
}