zoukankan      html  css  js  c++  java
  • Android中Handler

    本文通过例子来验证和说明使用Handler对象开启的线程是否和主线程为在同一线程中。

    程序结构图如下:

    [1] HandlerActivity.java中的源码如下:

    1. package com.andyidea.handlerdemo2; 
    2.  
    3. import android.app.Activity; 
    4. import android.os.Bundle; 
    5. import android.os.Handler; 
    6. import android.os.HandlerThread; 
    7. import android.os.Looper; 
    8. import android.os.Message; 
    9. import android.util.Log; 
    10.  
    11. public class HandlerActivity extends Activity { 
    12.      
    13.     private Handler handler = new Handler(); 
    14.      
    15.     @Override 
    16.     public void onCreate(Bundle savedInstanceState) { 
    17.         super.onCreate(savedInstanceState); 
    18.         //handler.post(r); 
    19.         setContentView(R.layout.main); 
    20.         Log.e("activity-->" ,Thread.currentThread().getId() + ""); 
    21.         Log.e("activityname-->" ,Thread.currentThread().getName() + ""); 
    22.         
    23.         //与主线程同一线程 
    24.         handler.post(r); 
    25.          
    26.         //与主线程不同线程 
    27.         HandlerThread handlerThread = new HandlerThread("handler_thread"); 
    28.         handlerThread.start(); 
    29.         //HandlerThread线程对象要启动后, 
    30.         //通过handlerThread.getLooper()方法才能获得Looper对象 
    31.         MyHandler myHandler = new MyHandler(handlerThread.getLooper()); 
    32.         Message msg  = myHandler.obtainMessage(); 
    33.         msg.sendToTarget();  //发送消息的方式 
    34.     } 
    35.      
    36.     //创建一个线程对象 
    37.     Runnable r = new Runnable() { 
    38.          
    39.         @Override 
    40.         public void run() { 
    41.             Log.e("handler-->" ,Thread.currentThread().getId() + ""); 
    42.             Log.e("handlername-->" ,Thread.currentThread().getName() + ""); 
    43.             try{ 
    44.                 Thread.sleep(10*1000); 
    45.             }catch(InterruptedException e){ 
    46.                 e.printStackTrace(); 
    47.             } 
    48.         } 
    49.     }; 
    50.      
    51.     //创建Handler对象 
    52.     class MyHandler extends Handler{ 
    53.          
    54.         public MyHandler(){ 
    55.              
    56.         } 
    57.          
    58.         public MyHandler(Looper looper){ 
    59.             super(looper); 
    60.         } 
    61.  
    62.         @Override 
    63.         public void handleMessage(Message msg) { 
    64.             Log.e("handler-->" ,Thread.currentThread().getId() + ""); 
    65.             Log.e("handler-->" ,Thread.currentThread().getName() + ""); 
    66.         } 
    67.          
    68.     } 

    运行程序后,我们通过Logcat控制台的log.e输出可以看到结果如下:

    通过验证,可以看到如果只是通过Handler对象的post()方法,只是把一个子线程对象放到主线程队列中,并不是开启了一个子线程。通过HandlerThread对象方式才是开启了一个新的线程去执行程序。

  • 相关阅读:
    秒杀多线程第八篇 经典线程同步 信号量Semaphore
    SURF特征
    (最短路径算法整理)
    中国大推力矢量发动机WS15 跨入 世界先进水平!
    SQL Profile 总结(一)
    Spring下@ResponseBody响应中文内容乱码问题
    Ubuntu12.04下jamvm1.5.4+classpath-0.98成功执行 helloworld.class
    【2012.1.24更新】不要再在网上搜索eclipse的汉化包了!
    [数据结构] N皇后问题
    DG之主库、备库切换(物理备库)
  • 原文地址:https://www.cnblogs.com/mistor/p/2490667.html
Copyright © 2011-2022 走看看