zoukankan      html  css  js  c++  java
  • handler post(Runable)运行在哪个线程

     
     

    方法一:

    (java

    习惯,在

    android

    不推荐使用)

     

    刚刚开始接触

    android

    线程编程的时候,习惯好像

    java

    一样,试图用下面的代码解决问题

     

    new

     Thread( 

    new

     Runnable() {   

      

     

        

    public

     

    void

     run() {   

      

     

        

       

      myView.invalidate(); 

       

     

        

     }  

       

       

       

     

     

    }).start();

     

    可以实现功能,刷新

    UI

    界面。但是这样是不行的,因为它违背了单线程模型:

    Android UI

    作并不是线程安全的并且这些操作必须在

    UI

    线程中执行。

     

    方法二:(

    Thread+Handler)

     

    查阅了文档和

    apidemo

    后,发觉常用的方法是利用

    Handler

    来实现

    UI

    线程的更新的。

     

    Handler

    来根据接收的消息,处理

    UI

    更新。

    Thread

    线程发出

    Handler

    消息,通知更新

    UI

     

    Handler myHandler = 

    new

     Handler() {  

     

        

       

       

    public

     

    void

     handleMessage(Message msg) {    

        

       

       

       

      

    switch

     (msg.what) {  

     

     

        

       

       

       

       

       

     

    case

     TestHandler.GUIUPDATEIDENTIFIER:  

      

        

       

       

       

       

       

       

       myBounceView.invalidate(); 

      

        

       

       

       

       

       

       

       

    break

    ;   

     

        

       

       

       

      } 

      

     

        

       

       

       

      

    super

    .handleMessage(msg);  

     

     

        

       

       }   

     

        

     };  

     

     

    class

     myThread 

    implements

     Runnable {   

     

        

       

       

    public

     

    void

     run() {  

     

        

       

       

       

      

    while

     (!Thread.currentThread().isInterrupted()) {   

      

        

       

       

       

       

       

       

     

     

        

       

       

       

       

       

     Message message = 

    new

     Message();  

     

     

        

       

       

       

       

       

     message.what = TestHandler.GUIUPDATEIDENTIFIER; 

       

        

       

       

       

       

       

       

     

        

       

       

       

       

       

     TestHandler.

    this

    .myHandler.sendMessage(message);    

        

       

       

       

       

       

     

    try

     { 

      

     

        

       

       

       

       

       

       

       Thread.sleep(100); 

       

     

        

       

       

       

       

       

     } 

    catch

     (InterruptedException e) {   

     

        

       

       

       

       

       

       

       Thread.currentThread().interrupt(); 

       

        

       

       

       

       

       

     }  

     

     

        

       

       

       

      } 

      

     

        

       

       }   

     

        

     }  

     

     

    以上方法

    demo

    :

    http://rayleung.javaeye.com

    /blog/411860

     

    方法三:(

    java

    习惯,不推荐)

     

    Android

    平台中需要反复按周期执行方法可以使用

    Java

    上自带的

    TimerTask

    类,

    Tim

    erTask

    相对于

    Thread

    来说对于资源消耗的更低,除了使用

    Android

    自带的

     

    AlarmManager

    使用

    Timer

    定时器是一种更好的解决方法。

     

    我们需要引入

    import 

    java.util.Timer; 

     

    import java.util.Tim

    erTask;

     

    public

     

    class

     JavaTimer 

    extends

     Activity {  

     

      

     

        Timer timer = 

    new

     Timer();  

     

        TimerTask task = 

    new

     TimerTask(){   

     

        

       

     

    public

     

    void

     run() {  

     

        

       

       

      setTitle("hear me?");  

     

        

       

     }  

       

       

       

     

     

        };  

     

     

        

    public

     

    void

     onCreate(Bundle savedInstanceState) {   

        

       

     

    super

    .onCreate(savedInstanceState);   

        

       

     setContentView(R.layout.main);   

        

       

     

        

       

      timer.schedule(task, 10000); 

      

     

        }  

     

    }  

     

    方法四:

    (TimerTask + Handler)

     

    实际上这样做是不行的,这跟

    Android

    的线程安全有关!应该通过配合

    Handler

    来实现

    timer

    功能的!

     

    public

     

    class

     TestTimer 

    extends

     Activity {  

     

      

     

        Timer timer = 

    new

     Timer();  

     

        Handler handler = 

    new

     Handler(){   

     

        

       

     

    public

     

    void

     handleMessage(Message msg) {   

        

       

       

      

    switch

     (msg.what) {  

       

     

     

        

       

       

      

    case

     1:   

       

     

        

       

       

       

       setTitle("hear me?");  

     

        

       

       

       

       

    break

    ;   

       

     

        

       

       

      } 

       

      

     

        

       

       

      

    super

    .handleMessage(msg);  

     

        

       

     }  

     

        

       

       

     

        };  

     

     

        TimerTask task = 

    new

     TimerTask(){   

     

     

        

       

     

    public

     

    void

     run() {  

     

        

       

       

      Message message = 

    new

     Message(); 

       

      

     

        

       

       

      message.what = 1;  

       

     

     

        

       

       

      handler.sendMessage(message);  

      

    自我的修养,从点滴做起。
  • 相关阅读:
    软件:IIS上配置CGI
    腾讯RTX二次开发相关的一些注意事项
    ABP从入门到精通(3):aspnet-zero-core 使用Redis缓存
    ABP从入门到精通(2):aspnet-zero-core 使用MySql数据库
    ABP从入门到精通(1):aspnet-zero-core项目启动及各项目源码说明
    nodejs-ORM 操作数据库中间件waterline的使用
    nodejs-日志组件log4js的使用方法
    使用 Live555 搭建流媒体服务器
    如何在Windows资源管理器右键菜单中 添加CMD
    .NET 通过 Autofac 和 DynamicProxy 实现AOP
  • 原文地址:https://www.cnblogs.com/tshq/p/5690090.html
Copyright © 2011-2022 走看看