子线程能不能谈吐司呢?
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);
网友评论