Android 之 子线程中创建子线程以及子线程中toast 问题
来源:互联网 发布:神魔诛天战宠进阶数据 编辑:程序博客网 时间:2024/05/16 14:20
最近学习handler时,碰到一个自觉得有意思的问题,
有人说:“new Thread(run(){ //第1层子线程new Thread(run(//第2层子线程new Thread(run(){//第3层子线程}).start()) ).start()}).start()我想知道子线程套用子线程会有什么情况 我感觉后面的应该叫孙线程 曾孙线程”
关于这个问题 我们需要明白一个点,以上这种,看似是线程嵌套,其实,线程是没有嵌套关系的。线程与线程之间只有主副关系,一个子线程必须依赖一个主线程,而且主线程只有一个。当主线程关闭时,其下的所有子线程都会关闭。
而在子线程中toast 原理是和子线程中创建handler是差不多的。我们知道,普通线程是不能直接new一个handler的。
原因如下:
public Handler(){ ….. mLooper = Looper.myLooper(); if (mLooper == null) { throw new RuntimeException( "Can't create handler inside thread that has not called Looper.prepare()"); } ….. }
而Looper中
public static final Looper myLooper() {
//这个方法是从当前线程的ThreadLocal中拿出设置的looper
return (Looper)sThreadLocal.get();
}
而事实上子线程只是一个普通的线程,其ThreadLoacl中没有设置过Looper,所以会抛出异常
如果需要在子线程中弹toast ,可如下解决:
new Thread(){ public void run() { Log.i("log", "run"); Looper.prepare(); Toast.makeText(ActivityTestActivity.this, "toast", 1).show(); Looper.loop(); }; }.start();就是手动加上 Looper.prepare()方法和Loop方法。
Looper.prepare()方法如下,可参考
public static final void prepare() { if (sThreadLocal.get() != null) { throw new RuntimeException("Only one Looper may be created per thread"); } sThreadLocal.set(new Looper()); }
0 0
- Android 之 子线程中创建子线程以及子线程中toast 问题
- Android 子线程中Toast的问题
- 子线程中Toast
- 子线程中Toast
- 子线程中使用Toast
- 子线程中发Toast
- 在子线程中Toast
- 在子线程中Toast
- Android 子线程中使用Toast
- android 子线程 Toast
- Android开发之在子线程中使用Toast
- Android中Toast如何在子线程中调用
- Android中Toast如何在子线程中调用
- Android中Toast如何在子线程中调用
- 子线程中创建对话框
- 子线程中创建handler
- 子线程中添加Toast的方法
- Linux线程中创建子线程实验
- Java图形界面(GUI) 动态获取上传或下载文件的路径问题
- 大数据技术Hadoop面试题,看看你能答对多少?答案在后面
- 关于Android使用ActionBarDrawerToggle时导航图标没有动画效果
- 导出Javadoc文件时的编码问题
- Memcache原理分析
- Android 之 子线程中创建子线程以及子线程中toast 问题
- web开发-阿里云服务器自定义镜像设置和快照设置-学习笔记十一
- 关于ArcObjects图层编辑的读写编辑锁
- nginx+tomcat集群负载均衡
- web.xml加载自定义配置文件(.xml)
- FJHttp.request获取网络数据示例
- git 问题总结
- 【Java开发手册之编程规约(八)】注释规约
- $http传输数据量较大