Android ждет завершения залпа и позже обновляет интерфейс - PullRequest
0 голосов
/ 24 декабря 2018

Я использую пакет залпа для получения данных с веб-сайта (JSON).

Вот мой метод

  private void getEarthquakeList(){
        // ...

        // Instantiate the RequestQueue.
        RequestQueue queue = Volley.newRequestQueue(this);
        //Earthquake Feeder
        String url ="https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/significant_month.geojson";

        // Request a string response from the provided URL.
        StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        Log.d("Response is: ",response);
                        //Parsing Json
                        parseJson(response);
                        final ListView earthquakeListView = (ListView)findViewById(R.id.list);
                        //Sort the array according to magnitude
                        earthquakeArrayList.sort((a, b) -> Double.compare(b.getTime(), a.getTime()));
                        mAdapter = new EarthquakeAdapter(getApplicationContext(), earthquakeArrayList);
                        earthquakeListView.setAdapter(mAdapter);

                    }
                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Log.d("Error",error.getMessage());
            }
        });

        // Add the request to the RequestQueue.
        queue.add(stringRequest);
    }

Проблема в том, что сейчас я обновляю пользовательский интерфейс внутри этогометод после того, как он возвращает ответ.

Это строки

//Sort the array according to a date
earthquakeArrayList.sort((a, b) -> Double.compare(b.getTime(), a.getTime()));
mAdapter = new EarthquakeAdapter(getApplicationContext(), earthquakeArrayList);
earthquakeListView.setAdapter(mAdapter);

Пока я работаю в MainActivity, проблем нет, пользователь открывает приложение и получает список землетрясений.

Проблемы начинаются, когда я хочу переключиться на службу, где я наблюдаю каждые несколько минут, или когда содержание веб-сайта меняется.Поэтому я хочу, чтобы мой метод без обновления интерфейса в нем.Проблема в том, что если я не обновляю пользовательский интерфейс внутри onResponse, поток пользовательского интерфейса продолжает и приводит к пустому массиву.

Таким образом, этот массив остается пустым earthquakeArrayList, если я не делаю это внутри

public void onResponse(String response) 

Идеи о том, как разделить два, с одной стороны, запустив метод и извлекая данные, а с другой стороны, основной поток сможет получить доступ к данным и не завершить выполнение.Спасибо EG

1 Ответ

0 голосов
/ 24 декабря 2018

В настоящее время рекомендуется использовать LiveData .LiveData работает с шаблоном Observer , поэтому вы можете иметь любое количество наблюдателей за обновленными данными как в Сервисе, так и в Деятельности, но они должны находиться в одном контексте.Это немного сложные темы, но хороший способ отделить ваш пользовательский интерфейс от слоя данных.Вы можете перейти по этим двум ссылкам

...