参考出处:http://www.cnblogs.com/net168/p/4237528.html
(会有窗体泄漏has leaked window) 避免在线程removeView
public class MyToast {
boolean mShowTime;
boolean mIsShow;
WindowManager mWdm;
Timer mTimer;
View mToastView;
WindowManager.LayoutParams mParams;
public MyToast(Context context, String text, boolean showTime) {
mShowTime = showTime;//记录Toast显示长度类型
mIsShow = false;//记录当前Toast内容是否已显示
mWdm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
mToastView = Toast.makeText(context, text, Toast.LENGTH_SHORT).getView();//通过Toast实例获取当前android系统的默认Toast的View布局
mTimer = new Timer();
setParams();
}
/**
* 设置布局参数
*/
private void setParams() {
mParams = new WindowManager.LayoutParams();
mParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
mParams.width = WindowManager.LayoutParams.WRAP_CONTENT;
mParams.format = PixelFormat.TRANSLUCENT;
mParams.windowAnimations = R.style.anim_view;///设置进出动画效果
mParams.type = WindowManager.LayoutParams.TYPE_TOAST;
mParams.flags = WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE;
mParams.gravity = Gravity.BOTTOM;//位置
mParams.y = 50;
}
public static MyToast makeText(Context context, String text, boolean showTime) {
MyToast result = new MyToast(context, text, showTime);
return result;
}
/**
* 此处修改 避免窗体泄漏
*/
public void show() {
if (!mIsShow) {
mIsShow = true;
mWdm.addView(mToastView, mParams);
mTimer.schedule(new TimerTask() {
@Override
public void run() {
mHandler.sendEmptyMessage(1);
}
}, (long) (mShowTime ? 1500 : 1500));
}
}
Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
mWdm.removeViewImmediate(mToastView);
mIsShow = false;
super.handleMessage(msg);
}
};
}