Toast

子线程能不能谈吐司呢?

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);
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容