最近做项目,遇到了Toast一直不消失的问题,activity都退出了,还是没有消失
代码实现
public void onBackPressed()
{
if (mStop)
return;
MiniLog.i(TAG,"onBackPressed");
if (System.currentTimeMillis() - mCurrentClickTime > 2000)
{
// Toast toast;
String lang = Locale.getDefault().getCountry();
if (lang.equals("CN"))
toast = Toast.makeText(getApplicationContext(),"快速按两次返回键将退出!", Toast.LENGTH_LONG);
else if (lang.equals("TW"))
toast = Toast.makeText(getApplicationContext(),"快速按兩次返回鍵將退出!", Toast.LENGTH_LONG);
else
toast = Toast.makeText(getApplicationContext(),"Press the two time to return key to exit!", Toast.LENGTH_LONG);
toast.setGravity(Gravity.BOTTOM, 0, 0);
toast.show();
mCurrentClickTime = System.currentTimeMillis();
return;
}
}
在activity退出时,主动去cancle toast应该是比较合理的
private static Toast toast=null;
private static TextView textView = null;
private boolean isShowToast=false;
onBackPressed()里的逻辑不变,在activity的 onPause() 里执行toast.cancel();
网上有类似介绍
在实现一个功能的时候,遇到了Toast一直不消失的问题,因此,对Toast进行了一些研究。
先描述问题:有一个activity和一个thread,都有各自的handler。activity启动thread,双方通过handler进行交互。当在thread中运行到某种情况,会弹出toast进行信息提示,若此时退出activity,会出现Toast一直不消失的情况,直到用户手动清理内存才会消失。
通过查找资料了解到,Toast在创建时有一个context参数,通常我们是将一个activity做为context参数传递进去的。若activity完全退出了,则Toast的工作环境异常,某些动作就不能实现了,例如hide()或者cancle()不能正常调用运行,表现出来就是提示信息不能自动消失。
调用Toast的show(),是将一个要显示的消息入了队列,调用cancel()即可取消。另外,Toast信息提示框在显示一定时间后也会自动关闭,是因为在调用show()方法后,将消息加入了系统的Toast队列。系统会依次从队列中取出一个Toast,并显示它。在显示一段时间后,再关闭,然后再显示下一个Toast信息提示框。直到Toast队列中所有Toast都显示完为止。
然而,我在thread的handler里面,在收到退出消息时,调用了Toast的cancel(),仍然不能解决问题。
后来想到一点:收到activity发出的退出消息时,是否已经有所滞后了,此时会不会activity已经被销毁了?
基于这点考虑,我将消息的显示与cancel()都转移到activity中来实现,最终解决了问题。
通常我们调用Toast是这样做的,
Toast.makeText(activity, "有一个提示信息", Toast.LENGTH_SHORT).show();
- 1
现在,为了能取消掉一个Toast,需要将Toast对象变成类的成员,便于在不同函数中进行访问。
下面,分步骤展示了解决问题的过程:
1,在activity中定义:
private static Toast toast=null;
private static TextView textView = null;
private boolean isShowToast=false;
2,在onCreate()中初始化:
toast = new Toast(this);
textView = new TextView(this);
textView.setLayoutParams(new LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT));
toast.setDuration(Toast.LENGTH_SHORT);
toast.setView(textView);
3,定义一个public的函数,用于在其他类中进行访问:
public void showToast(String str) {
textView.setText(str);
toast.show();
isShowToast = true;
}
4,在thread的handler中,在需要时进行调用:
activity.showToast("有一个提示信息");
说明,此activity即前面所说的activity,通过参数传递到thread中来的。
5,在activity中的onPause()里面,通知thread退出时,同时调用cancel():
if(isShowToast == true){
toast.cancel();
}
经测试,工作良好。
参考:
http://www.cnblogs.com/likwo/p/3857786.html
http://blog.csdn.net/marsmmeng/article/details/48270889