我有一个ListView,我需要每秒重绘一次。所以我尝试让我的MainActivity实现Runnable并从run()调用notifyDatasetChanged()。然后我创建了一个ScheduledThreadPoolExecutor来每秒运行一次MainActivity。但现在我得到了CalledFromWrongThreadExceptions。我怎么能绕过这个?
答案 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);
这与我合作