从一个线程更新界面 [英] Update UI from a thread

查看:265
本文介绍了从一个线程更新界面的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一些麻烦试图automaticaly更新我的Andr​​oid活动视图。
该应用程序显示一个类似的聊天有些消息。即时通讯使用一个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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆