博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android中Handler的使用[二]
阅读量:6636 次
发布时间:2019-06-25

本文共 3216 字,大约阅读时间需要 10 分钟。

    本文通过例子来验证和说明使用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. }  

package com.andyidea.handlerdemo2; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.HandlerThread; import android.os.Looper; import android.os.Message; import android.util.Log; public class HandlerActivity extends Activity { private Handler handler = new Handler(); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //handler.post(r); setContentView(R.layout.main); Log.e("activity-->" ,Thread.currentThread().getId() + ""); Log.e("activityname-->" ,Thread.currentThread().getName() + ""); //与主线程同一线程 handler.post(r); //与主线程不同线程 HandlerThread handlerThread = new HandlerThread("handler_thread"); handlerThread.start(); //HandlerThread线程对象要启动后, //通过handlerThread.getLooper()方法才能获得Looper对象 MyHandler myHandler = new MyHandler(handlerThread.getLooper()); Message msg = myHandler.obtainMessage(); msg.sendToTarget(); //发送消息的方式 } //创建一个线程对象 Runnable r = new Runnable() { @Override public void run() { Log.e("handler-->" ,Thread.currentThread().getId() + ""); Log.e("handlername-->" ,Thread.currentThread().getName() + ""); try{ Thread.sleep(10*1000); }catch(InterruptedException e){ e.printStackTrace(); } } }; //创建Handler对象 class MyHandler extends Handler{ public MyHandler(){ } public MyHandler(Looper looper){ super(looper); } @Override public void handleMessage(Message msg) { Log.e("handler-->" ,Thread.currentThread().getId() + ""); Log.e("handler-->" ,Thread.currentThread().getName() + ""); } } }

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

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

转载地址:http://vnsvo.baihongyu.com/

你可能感兴趣的文章
内存泄露
查看>>
python使用get在百度搜索并保存第一页搜索结果
查看>>
如何使用鲁大师进行驱动备份
查看>>
正则练习
查看>>
Linux 第三天
查看>>
在vue中关于element UI 中表格实现下载功能,表头添加按钮,和点击事件失效的解决办法。...
查看>>
软件需求模式阅读笔记之六
查看>>
商城项目搭建
查看>>
39页作业(求x^n)
查看>>
Xe7 System.Json解析数据格式
查看>>
Disk Tree
查看>>
第一次团队作业
查看>>
通过echarts的demo
查看>>
复(单)选框与文字对齐问题
查看>>
Markdown 11种基本语法
查看>>
Alcatraz安装在xcode7失败执行下面代码
查看>>
小菜鸡进阶之路.文件操作遇到坑
查看>>
java代码-----------继承练习
查看>>
CentOS7中java环境的安装
查看>>
vue根据路由判断所在的内容
查看>>