用寫Java的傳統想法,寫出了這樣的程式
其中ListItemProducer.getInstance().getList()會傳回ArrayList<string>
ArrayAdapter adapter = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
...
list = (ListView) findViewById(R.id.listView1);
adapter = new ArrayAdapter(ListActivity.this, android.R.layout.simple_list_item_1, ListItemProducer.getInstance().getList());
list.setAdapter(adapter);
timer = new Timer();
timer.schedule(new MyTask(), 5000, 10000);
}
class MyTask extends TimerTask {
@Override
public void run() {
adapter.notifyDataSetChanged();
}
}
一執行,當掉了,怎麼可能!?
這樣的Java程式我寫了無數次了,不應有錯呀
靜下心仔細看了一下,原來出現"Only the original thread that created a view hierarchy can touch its views."的exception
Android只允許原始的thread去變動views,上面的MyTask是在另一個thread跑,不被允許去碰views
找找資料,Handler倒是個解決問題的好方向
於是加了這段
private Handler updateHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
adapter.notifyDataSetChanged();
}
};
然後把 MyTask改成
class MyTask extends TimerTask {
@Override
public void run() {
try {
updateHandler.sendEmptyMessage(0);
} catch (Exception e) {
e.printStackTrace();
}
}
}
讓MyTask在每次時間到時,透過handler來送message回原來的thread,讓原來的thread去做update views的工作
沒有留言:
張貼留言