下面的代码显示了我目前的实现,这里我创建了一个toast对象并在onPause()中关闭。在没有toast队列之前,此操作可以正常工作。
public static long **savedTimeStamp=0**;
Toast showToastMessage;
if(System.currentTimeMillis()/1000 - savedTimeStamp >= 60 || savedTimeStamp==0){
showToastMessage=Toast.makeText(this.this, "Toast message", Toast.LENGTH_LONG);
showToastMessage.show();
savedTimeStamp=System.currentTimeMillis()/1000;
}
@Override
protected void onPause() {
super.onPause();
if(showToastMessage!=null)
{
showToastMessage.cancel();
}
}
我发现只使用Toast
的一个实例效果最好。第一次分配它,然后用setText
更新它并重新显示。然后cancel按预期工作,因为只有一个实例要取消。
if (showToastMessage != null) {
showToastMessage.setText("New Toast message");
showToastMessage.show();
} else {
showToastMessage = Toast.makeText(showString.this,"First Toast message",Toast.LENGTH_LONG);
showToastMessage.show();
}
创建一个像这样的泛型类:
public class JToast {
private static Toast toast;
private static int LENGTH_LONG=Toast.LENGTH_LONG;
private static int LENGTH_SHORT=Toast.LENGTH_SHORT;
public static Toast makeText(Context context, String text, int duration) {
if (toast != null) {
toast.cancel();
}
toast = Toast.makeText(context, text, duration);
return toast;
}
public void show(){
toast.show();
}
}
你只要叫
就能得到祝酒词JToast.makeText(context, "My Toast Message", JToast.LENGTH_SHORT).show();
创建自己的单例类,具有handler
和LooperThread
。创建一个类似showText(text, duration)
的方法,在它内部创建一个可运行对象。
在它的run方法中,用你的文本创建一个Toast对象,然后post到handler。
循环线程将执行代码来查看处理程序是否为空,如果是则创建它。
这样,每次生成toast消息时,它将立即在UI上更新,而不是在队列中排队。
最后的结论是:Toast in Que不可阻挡。所以不要在que中使用toast