每秒调用ListView.notifyDatasetChanged()

时间:2013-12-27 21:53:03

标签: android

我有一个ListView,我需要每秒重绘一次。所以我尝试让我的MainActivity实现Runnable并从run()调用notifyDatasetChanged()。然后我创建了一个ScheduledThreadPoolExecutor来每秒运行一次MainActivity。但现在我得到了CalledFromWrongThreadExceptions。我怎么能绕过这个?

4 个答案:

答案 0 :(得分:0)

所以不确定你需要这个,但是你应该只使用附加到主线程的Handler而不是ThreadPoolExecutor。原因是您无法在上下文中绘制或从主线程以外的任何其他线程调用notifyDataSetChanged()

首先尝试启动该过程:

listView.postDelayed(mRunnable, 1000);因为每个视图都附加到它附加到上下文的线程,在这种情况下是主线程。所以这是一个很方便的方法。

内部 MainActivity

private Runnable mRunnable = new Runnable() {
   public void run() {
       mAdapter.notifyDataSetChanged();
       listView.postDelayed(this, 1000);
   }
};

答案 1 :(得分:0)

另一种方法是执行以下操作:

调用以下方法notifyDataSetChangedEverySecond()一次。它设置了一个每1000毫秒调用一次的计时器。

private void notifyDataSetChangedEverySecond() {
    Timer timer = new Timer();
    timer.schedule(new TimerTask() {
        @Override
        public void run() {
            listview.notifyDatasetChanged();
        }
    },0,1000);
}

答案 2 :(得分:0)

您可以使用handler而不是ScheduledThreadPoolExecutor,因为它会创建线程。或者您可以使用runOnUiThread上下文方法更新您的ui线程,如下所示:

runOnUiThread(new Runnable() {
   public void run() {
      listView.notifyDataSetChanged();
   }
}

使用此方法调用notifyDataSetChanged并获取错误...

答案 3 :(得分:0)

new Timer().scheduleAtFixedRate(new TimerTask() {
        @Override
        public void run() {
            generateData();

            // notifydataset Only the original thread that created a view hierarchy can touch its views
            MainActivity.this.runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    adapter.notifyDataSetChanged();
                }
            });
        }
    }, new Date(System.currentTimeMillis()), 1000);

这与我合作