博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
android 中handler的用法分析
阅读量:5905 次
发布时间:2019-06-19

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

1、直接再ui线程中初始化,这种情况handlermessage会在 ui线程中执行

2、传入Looper 参数,这种情况会在ht线程中执行 handlermessage。

HandlerThread ht = new HandlerThread("handler");ht.start();Handler handler = new Handler(ht.getLooper());

步骤分析:

1、HandlerThread 继承Thread

public void run() {        mTid = Process.myTid();        Looper.prepare();        synchronized (this) {            mLooper = Looper.myLooper();            notifyAll();        }        Process.setThreadPriority(mPriority);        onLooperPrepared();        Looper.loop();        mTid = -1;    }

2、在run 分别初始化 ,绑定Looper 到当前线程,并且执行looper 循环处理MessageQuene 中的message

//初始化Looper a) Looper.prepare();b) if (sThreadLocal.get() != null) {            throw new RuntimeException("Only one Looper may be created per thread");        }        sThreadLocal.set(new Looper());c) private Looper() {        mQueue = new MessageQueue();        mRun = true;        mThread = Thread.currentThread();    }//绑定 Looper 到当前线程 a) sThreadLocal.set(new Looper()); b) public void set(T value) {        Thread currentThread = Thread.currentThread();//取出当前线程中的ThreadLocal.Values变量     Values values = values(currentThread);        if (values == null) {            values = initializeValues(currentThread);        }//将Looper变量保存到ThreadLocal.Values 变量中        values.put(this, value);    }c) Values values(Thread current) {        return current.localValues;    }//循环处理MessageLooper.looper()

所以线程ht.getLooper() 可以用 ThreadLocal 从 当前线程中获取 Looper

3 、Handler 中的MessageQuene 为 Looper中 MessageQuene 的引用 ,sendmessage将Message保存到 MessageQuene,然后 再loop中取用。

public boolean sendMessageAtTime(Message msg, long uptimeMillis)    {        boolean sent = false;        MessageQueue queue = mQueue;        if (queue != null) {            msg.target = this;            sent = queue.enqueueMessage(msg, uptimeMillis);        }        else {            RuntimeException e = new RuntimeException(                this + " sendMessageAtTime() called with no mQueue");            Log.w("Looper", e.getMessage(), e);        }        return sent;    }

 Handler 另外用法 在service(或者非UI线程)中调用Toast等UI操作

looper = Looper.getMainLooper();handler = new Handler(looper);handler.post(new Runnable(){   public void run()   {       Toast.makeText().show();     }}); 同样可以使用Activity.runOnUiThread(Runnable r);

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

你可能感兴趣的文章
海归千千万 为何再无钱学森
查看>>
vue2.0 仿手机新闻站(六)详情页制作
查看>>
JSP----九大内置对象
查看>>
Java中HashMap详解
查看>>
delphi基本语法
查看>>
260. Single Number III
查看>>
Hadoop生态圈-Kafka的完全分布式部署
查看>>
[MODx] Build a CMP (Custom manager page) using MIGX in MODX 2.3 -- 1
查看>>
jQuery自动完成点击html元素
查看>>
[算法]基于分区最近点算法的二维平面
查看>>
webpack多页应用架构系列(七):开发环境、生产环境傻傻分不清楚?
查看>>
笨办法学C 练习1:启用编译器
查看>>
树的总结--树的性质(树的深度) leetcode
查看>>
【Android游戏开发之六】在SurfaceView中添加组件!!!!并且相互交互数据!!!!...
查看>>
linux 将大文件分成小文件
查看>>
CCNA- 距离矢量路由协议学习
查看>>
企业实践用户邮箱导入/导出(第2部分)
查看>>
如何学习Linux命令-初级篇
查看>>
从Oracle Public Yum为Oracle Linux建立本地的Yum源
查看>>
静态路由和默认路由
查看>>