从一个线程更新界面 [英] Update UI from a thread
问题描述
我有一些麻烦试图automaticaly更新我的Android活动视图。
该应用程序显示一个类似的聊天有些消息。即时通讯使用一个ListView把消息与一个ArrayAdapter。
我用这个梅托德更新的ListView
公共无效loadMessages(){
ArrayList的<串GT;消息= this.dbHelper.getMessages();
conversationArrayAdapter.clear();
conversationArrayAdapter.addAll(消息);
conversationArrayAdapter.notifyDataSetChanged();
}
我的想法是把调用该梅托德一个线程,但是当我尝试这样做,我有以下错误。
只有创建视图层次可以触摸它认为原来的线程。
块引用>解决方案您必须使用自己的线程。下面是使用AsyncTask的解决方案....
所有code将在你Activity类。
公共无效toCallAsynchronous(){
最后的处理程序处理程序=新的处理程序();
定时器定时器=新的Timer();
TimerTask的doAsynchronousTask =新的TimerTask(){
@覆盖
公共无效的run(){
handler.post(新的Runnable(){
公共无效的run(){
尝试{
//异步任务对象CALL每2 SECOND
汽车pretraga zadatak =新的自动pretraga();
zadatak.execute(TXT pretraga.getText()的toString());
}
});
}
};
timer.schedule(doAsynchronousTask,0,2000); //每2每秒钟内可执行 }的AsyncTask类.....
私有类汽车pretraga延伸
AsyncTask的<弦乐,对象,列出< Korisnici>> { @覆盖
保护列表与LT; Korisnici> doInBackground(字符串... PARAMS){
//别碰GUI对象在这个函数!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//调用数据库在这个函数
返回null; } @覆盖
保护无效onPostExecute(列表< Korisnici>的结果){
super.onPostExecute(rezultat);
//在这个函数您已经RESUT从数据库中
//,你可以改变GUI } }I'm having some trouble trying to update automaticaly a view in my android activity. The application display some message like a chat. Im using a ListView to put the message with a ArrayAdapter.
I use this metod to update the ListView
public void loadMessages() { ArrayList<String> messages = this.dbHelper.getMessages(); conversationArrayAdapter.clear(); conversationArrayAdapter.addAll(messages); conversationArrayAdapter.notifyDataSetChanged(); }
My idea is to put a thread that call that metod, but when i try to do this i have the following error.
Only the original thread that created a view hierarchy can touch its view.
解决方案You must use your own Thread. Here is solution using AsyncTask....
All code put in your Activity class.
public void toCallAsynchronous() { final Handler handler = new Handler(); Timer timer = new Timer(); TimerTask doAsynchronousTask = new TimerTask() { @Override public void run() { handler.post(new Runnable() { public void run() { try { //ASYNC TASK OBJECT CALL EVERY 2 SECOND AutoPretraga zadatak = new AutoPretraga(); zadatak.execute(txtPretraga.getText().toString()); } }); } }; timer.schedule(doAsynchronousTask, 0, 2000); // execute in every 2 second }
AsyncTask class.....
private class AutoPretraga extends AsyncTask<String, Object, List<Korisnici>> { @Override protected List<Korisnici> doInBackground(String... params) { //DONT TOUCH GUI OBJECT IN THIS FUNCTION !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! //CALL DATABASE IN THIS FUNCTION return null; } @Override protected void onPostExecute(List<Korisnici> result) { super.onPostExecute(rezultat); //IN THIS FUNCTION YOU HAVE RESUT FROM DATABASE //AND YOU CAN CHANGE GUI } }
这篇关于从一个线程更新界面的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!