子线程中更新UI操作

来源:互联网 发布:情趣内衣淘宝卖家秀 编辑:程序博客网 时间:2024/06/14 12:38

1.使用Handler+Message的机制:

使用步骤:

 主线程:  Handler handler=new Handler(){     public void handleMessage(Message msg){             //接受数据            // 更新ui     }  };子线程:new Thread(){   public void run(){     Message msg=Message.obtain();     msg.obj=数据;     handler.sendMessage(msg);  //handleMessage();      }  }.start();

主程序中:

Handler handler=new Handler(){    public void handleMessage(android.os.Message msg) {        String content=(String)msg.obj;        tv.setText(content);        };};

MainActivity的oncreat方法中:

//1.handler实现    new Thread(){    public void run() {        SystemClock.sleep(1000); //设置线程睡眠        Message msg=Message.obtain();        msg.obj="我就更新ui线程中的控件";        handler.sendMessage(msg);    };}.start();

2.使用runOnUIThread()方法:封装了Handler+Message

使用步骤:

    new Thread(){          public void run(){              runOnUiThread(                    new Runnable(){                         public void run(){                           // 更新ui             }            }          );      }  }.start();

//2.使用runOnUiThread

    new  Thread(){        public void run() {            SystemClock.sleep(1000);            //runOnUiThread运行在主线程中的,如果当前线程是主线程就运行,否则加入主线程队列            runOnUiThread(new Runnable() {                @Override                public void run() {                    tv.setText("使用runOnUiThread更新ui");                }            });        };      }.start();

3.使用延迟机制postDelayed实现在子线程中更新主线程的UI:第二个参数是延迟执行的时间(毫秒值)

使用场景:启动界面+主程序在一个方法中:(先显示布局文件里面的text内容,延迟后显示这里的内容)
使用步骤:

 new Handler().postDelayed(    new Runnable(){          public void run(){               // 更新ui       }  },2000);

//3.使用延迟机制实现在子线程中更新主线程ui,第二个参数是延迟执行的时间
new Handler().postDelayed(new Runnable() {

        @Override        public void run() {            tv.setText("使用延迟机制实现在子线程中更新主线程ui");        }    }, 2000);

4.定时器timer:还需要使用runOnuiThread或是handler+message的机制

参数:一个long:和前几个没区别
两个long:第一个参数是执行之前的延迟时间,第二个参数是每个多长时间进行一次循环执行
使用场景:页面之间的链接执行操作
问题:退出之后依然会执行
解决:取消操作:cancel();
使用步骤:

Timer timer=new Timer();TimerTask task=new TimerTask(){   public void run(){        runOnUiThread(new Runnable(){             public void run(){                         // 更新ui              }         })     }};//timer.schedule(task,2000); timer.schedule(task,2000,1000); //4.定时器timer的应用    timer = new Timer();    task = new TimerTask() {        @Override        public void run() {            runOnUiThread(new Runnable() {                          @Override                public void run() {                    System.out.println("执行了一次又一次");                    tv.setText("执行任务,不回家睡觉!");                }            });         }    };    //timer.schedule(task, 2000);  //两秒钟后执行task    timer.schedule(task, 3000,1000);  //三秒钟后执行task,每间隔一秒钟执行一次} @Override//用来解决当退出任务时,在后台自己运行的问题:取消任务protected void onDestroy() {    super.onDestroy();    task.cancel();  //取消任务    timer.cancel();//取消定时器}
0 0