如何每 10 秒刷新一次 Android 列表视图

How to refresh Android listview evry 10 seconds

我对 Android 很陌生。我正在做这个 teturial 但我在刷新时遇到问题,无法理解如何刷新我的列表视图

        // Creating volley request obj
    JsonArrayRequest movieReq = new JsonArrayRequest(url,
            new Response.Listener<JSONArray>() {
                @Override
                public void onResponse(JSONArray response) {
                    Log.d(TAG, response.toString());
                    hidePDialog();

                    // Parsing json
                    for (int i = 0; i < response.length(); i++) {
                        try {

                            JSONObject obj = response.getJSONObject(i);
                            Movie movie = new Movie();
                            movie.setTitle(obj.getString("title"));
                            movie.setThumbnailUrl(obj.getString("image"));
                            movie.setRating(((Number) obj.get("rating"))
                                    .doubleValue());
                            movie.setYear(obj.getInt("releaseYear"));

                            // Genre is json array
                            JSONArray genreArry = obj.getJSONArray("genre");
                            ArrayList<String> genre = new ArrayList<String>();
                            for (int j = 0; j < genreArry.length(); j++) {
                                genre.add((String) genreArry.get(j));
                            }
                            movie.setGenre(genre);

                            // adding movie to movies array
                            movieList.add(movie);

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

                    }

                    // notifying list adapter about data changes
                    // so that it renders the list view with updated data
                    adapter.notifyDataSetChanged();
                }
            }, new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    VolleyLog.d(TAG, "Error: " + error.getMessage());
                    hidePDialog();

                }
            });


/** REFRESH HERE /** 

 Thread t = new Thread() {

        @Override
        public void run() {
            try {
                while (!isInterrupted()) {
                    Thread.sleep(10000);
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            Log.e(TAG, "EVRY 10 SECOND START NOW ");

                            listView.invalidateViews();
                            listView.refreshDrawableState();
                            adapter.notifyDataSetChanged();

//                                Log.e(TAG, String.valueOf(movieList));

                            // fire the event

                        }
                    });
                }
            } catch (InterruptedException e) {
            }
        }
    };

    t.start();
    // Adding request to request queue
    AppController.getInstance().addToRequestQueue(movieReq);

我尝试了所有方法 google...但运气不好,这个 notifyDataSetChanged() 不起作用...

 listView.invalidateViews();
listView.refreshDrawableState();
adapter.notifyDataSetChanged();

使用 Handler 及其 postDelayed 方法使列表的适配器无效,如下所示:

    final Handler handler = new Handler();
    handler.postDelayed(new Runnable() {
        @Override
        public void run() {
            adapter.notifyDataSetChanged();
            handler.postDelayed(this, 10 * 1000);
        }
    }, 10 * 1000);

您只能在主 (UI) 线程中更新 UI。

通过在主线程中创建处理程序,您可以确保您 post 给处理程序的所有内容也在主线程中 运行。

将你的 Volley 请求代码放在一个方法中,让我们命名为 id fetchData();

然后您可以在 10 秒后通过以下代码再次调用您的服务:

final Handler mHandler = new Handler();

        new Thread(new Runnable() {
            @Override
            public void run() {
                while (true) {
                    try {
                        Thread.sleep(10000);
                        mHandler.post(new Runnable() {

                            @Override
                            public void run() {
                                // Write your code here to call the method.
                              fetchData();
                            }
                        });
                    } catch (Exception e) {
                        // TODO: handle exception here
                        e.printStackTrace();
                    }
                }
            }
        }).start();

试试这个,如果有任何问题请告诉我。

使用定时器:

 Timer timerAsync;
 TimerTask timerTaskAsync;

timerAsync = new Timer();
        timerTaskAsync = new TimerTask() {
            @Override
            public void run() {
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        doWork();
                    }
                });
            }
        };
        timerAsync.schedule(timerTaskAsync, 1000, 5000);// First Start 1 seconds 5 seconds repeat