• 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.     }  
    69. }  

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

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

  • 相关阅读:
    ubuntu下安装VMware tools
    ubuntu 输入su提示认证失败的解决方法
    Squishy Bird 压扁小鸟
    js 毫秒转日期(yy-MM-dd hh:mm:ss)
    js--使用构造器函数来新建对象及操作
    css中table样式
    js 字符串截取
    JavaScript中Math--random()/floor()/round()/ceil()
    canvas draw a image
    html5 canvas simple drawing
  • 原文地址:https://www.cnblogs.com/cnsanshao/p/2141686.html
Copyright © 2020-2023  润新知