如何实例化一个新的 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() 检查字符串的内容并将其与 StringBufferStringBuilderCharSequence 以及所有派生的 类 进行比较。

这就是为什么在你的情况下 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 方法中工作,那么您的问题就解决了。