Android 之 子线程中创建子线程以及子线程中toast 问题


最近学习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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值