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);  

      

    自我的修养,从点滴做起。
  • 相关阅读:
    指定的 LINQ 表达式包含对与不同上下文关联的查询的引用
    无法为具有固定名称“System.Data.SqlClient”的 ADO.NET 提供程序加载在应用程序配置文件中注册的实体框架提供程序类
    获取路径 GetModuleFileName() GetModuleFileName() GetCurrentDirectory
    重启动界面 ShellExecute() ShellExecute()
    MFC 强大功能函数
    extern 头文件 定义&声明
    全局变量/常量
    有时不需要头文件包含也能编译过
    字符串(3):字符串与函数
    函数不能传递动态内存
  • 原文地址:https://www.cnblogs.com/tshq/p/5690090.html
Copyright © 2011-2022 走看看