Arhn - архитектура программирования

Возврат ArrayList из метода с помощью залпа

Я пытаюсь вернуть arrayList, когда я возвращаю arrayList пуст. Я буду использовать, когда верну arrayList, но он не работает.

 public ArrayList<Cities> getCities(){
    final ArrayList<Cities> cities=new ArrayList<>();
    String url = "http://10.0.2.2:3000/cities";
    mQueue = Volley.newRequestQueue(context);
    JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, url, null,
            new Response.Listener<JSONObject>() {
                @Override
                public void onResponse(JSONObject response) {
                    try {
                        JSONArray jsonArray = response.getJSONArray("city");
                        for (int i = 0; i < jsonArray.length(); i++) {
                            JSONObject city = jsonArray.getJSONObject(i);
                            String id = city.getString("_id");
                            String name = city.getString("name");
                            Cities p=new Cities(id,name);
                            cities.add(p);
                        }
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            error.printStackTrace();
        }
    });
    mQueue.add(request);
return cities;
}

  • Должно быть что-то вроде public void getCities(SuccessCallback<ArrayList<Cities>> successCallback) {, где обратный вызов успеха - public interface SuccessCallback<T> { void onSuccess(T t); } 15.04.2019
  • Возврат из getCities происходит до того, как вы получите ответ в onResponse. Запрос/ответ залпа асинхронен с вашим getCities вызовом. 15.04.2019

Ответы:


1

Если ваш ответ возвращает JSONObject с массивом элементов City, состоящим из городов, ваш запрос верен, но, как упоминалось выше, вы не можете ожидать фактических результатов до тех пор, пока не будет вызван обратный вызов. Вот пример, в котором используется JSONArrayRequest, который возвращает JSONArray, но в значительной степени работает так же, как и ваш, после того, как вы извлекли массив City из JSONObject.

    private ListView mTripList;
public ArrayList<TripItem> tripItems;
private JSONArray unclaimedTrips;
private TripSelectAdapter adapter;



public void getTrips() {

        JsonArrayRequest req = new JsonArrayRequest(url, new Response.Listener<JSONArray> () {  

        @Override
        public void onResponse(JSONArray response) {

            // Public Array
            unclaimedTrips = response;

            tripItems = new ArrayList<TripItem>();


            // Optional if you want to manipulate the data in some way
            if (unclaimedTrips != null) {

                for (int i = 0; i < unclaimedTrips.length(); i++) {

                    try {
                        JSONObject item = unclaimedTrips.getJSONObject(i);

                        int tripID = item.getInt("trip_id");
                        int claimID = item.getInt("claim_id");
                        String payrollCode = item.getString("payroll_code");
                        String tripDate = item.getString("trip_date");
                        String tripPurpose = item.getString("trip_purpose");

                        TripItem tripItem = new TripItem(tripID, claimID, payrollCode, tripDate, tripPurpose);

                        tripItems.add(tripItem);

                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }

                refreshData();
            }

        }


    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            unclaimedTrips = null;
            refreshData();

        }
    }) {

       @Override
       public Map<String, String> getHeaders() throws AuthFailureError {
           HashMap<String, String> headers = new HashMap<String, String>();
                headers.put("Accept", "application/json");
                headers.put("Content-Type", "application/json");
           return headers;
       };
    };


    // add the request object to the queue to be executed
    MyApplication.getInstance().addToRequestQueue(req);
}


public void refreshData() {

    if (tripItems.isEmpty()) {
        mEmptyList.setVisibility(android.view.View.VISIBLE);
    } else {
        mEmptyList.setVisibility(android.view.View.GONE);                   
    }

    adapter = new TripSelectAdapter(this, thisContext, tripItems);
    mTripList.setAdapter(adapter);
}
15.04.2019

2

Ваша проблема в том, что вы пытаетесь вернуть что-то, что еще не заполнено, вызов асинхронный, поэтому может потребоваться некоторое время, чтобы заполнить дату в вашем ArrayList<Cities>, поэтому он пуст.

Вы должны удалить эту строку return cities; и не забудьте создать эту final ArrayList<Cities> cities=new ArrayList<>(); вне вашего метода и удалить возврат ArrayList<Cities> в void.

И затем вы можете создать обратный вызов, чтобы уведомить, что данные заполнены в вашем ArrayList<Cities>, если вы пытаетесь заполнить их в RecyclerView, я рекомендую вам установить адаптер в методе onResponse().

Чтобы сделать обратный вызов, вы можете взглянуть на этот ответ или на этот Gist

15.04.2019
Новые материалы

Коллекции публикаций по глубокому обучению
Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

Представляем: Pepita
Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

Советы по коду Laravel #2
1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

3 способа решить квадратное уравнение (3-й мой любимый) -
1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

Создание VR-миров с A-Frame
Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

Демистификация рекурсии
КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..