Android中Handler的使用[二]

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

程序结构图如下:

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

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对象方式才是开启了一个新的线程去执行程序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值