Android等待排球完成并稍后更新UI

时间:2018-12-24 09:36:26

标签: android android-volley

我正在使用排球包从网站(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);
    }

问题在于,现在我在返回响应之后正在更新此方法中的UI。

这些是线

//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中运行时,没有问题,用户打开应用程序并获取地震列表。

当我想切换到每隔几分钟监视一次的服务或网站内容更改时,问题就开始了。 所以我想要我的方法而不更新其中的UI。 问题是,如果我不更新onResponse中的UI,则UI线程将继续并导致空数组。

因此,如果我不在内部执行此操作,则此数组将保持空白earthquakeArrayList

public void onResponse(String response) 

想法如何将两者分开,一方面运行方法并获取数据,另一方面主线程将能够访问数据而不完成执行。 谢谢 EG

1 个答案:

答案 0 :(得分:0)

目前推荐的解决方案是使用LiveData。 LiveData可在Observer Pattern上运行,因此您可以在Service和Activity中拥有任意数量的观察者来查看更新的数据,但是它们必须处于同一上下文中。这些是一些高级主题,但是是将UI与数据层分离的一种好方法。您可以通过这两个链接