Toast

作者: 最美下雨天 | 来源:发表于2018-08-28 16:04 被阅读15次

子线程能不能谈吐司呢?

new Thread(new Runnable() {
                    @Override
                    public void run() {
                        MToast.showToast(MainActivity.this,"呢个不");
                    }
                }).start();

看下出错信息:


image.png

就是说没有调用Looper.prepare()方法,那我们闲调用一下吧

 new Thread(new Runnable() {
                    @Override
                    public void run() {
                        Looper.prepare();
                        MToast.showToast(MainActivity.this,"呢个不");
                        Looper.loop();
                    }
                }).start();
                break;

程序可以正常运行了,那么为什么要先调用Looper.prepare()呢?
我们知道在子线程中利用Handler的时候是必须先调用的
看下Toast的构造方法:

public Toast(@NonNull Context context, @Nullable Looper looper) {
        mContext = context;
        mTN = new TN(context.getPackageName(), looper);
        mTN.mY = context.getResources().getDimensionPixelSize(
                com.android.internal.R.dimen.toast_y_offset);
        mTN.mGravity = context.getResources().getInteger(
                com.android.internal.R.integer.config_toastDefaultGravity);
    }

Toast的构造方法中有一个关于TN的初始化,而在TN的构造方法中直接对Handler做了初始化


image.png

这就是上面报错的原因
至于Toast,本质上就是一个Window,是利用WindowManager addView的方式显示出来的


image.png

我们也可以这样显示一个Window

 WindowManager wm=(WindowManager)getSystemService(Context.WINDOW_SERVICE);
                View view= LayoutInflater.from(MainActivity.this).inflate(R.layout.window,null);
                WindowManager.LayoutParams params=new WindowManager.LayoutParams();
                params.width=300;
                params.height=300;
                params.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
                wm.addView(view,params);

相关文章

网友评论

      本文标题:Toast

      本文链接:https://www.haomeiwen.com/subject/tetqwftx.html