toast使用

最近做项目,遇到了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

时间: 2024-10-10 05:58:55

toast使用的相关文章

Jquery 仿 android Toast效果

JS代码如下: /** * 模仿android里面的Toast效果,主要是用于在不打断程序正常执行的情况下显示提示数据 * @param config * @return */var Toast = function(config){ this.context = config.context==null?$('body'):config.context;//上下文 this.message = config.message;//显示内容 this.time = config.time==nul

菜鸟的Xamarin.Forms前行之路——原生Toast的简单实现方法

项目中信息提示框,貌似只有个DisplayAlert,信息提示太过于单一,且在有些场合Toast更加实用,以下是一个简单的原生Toast的实现方法 项目地址:https://github.com/weiweu/TestProject/tree/dev/Toast 共享项目 定义一个接口IToast,包括Short和Long两个方法: public interface IToast { void LongAlert(string message); void ShortAlert(string m

Toast分析——实现自己的Toast

android 4.0以后,新增了一个功能:关闭某个应用发出的通知.Toast等.详细操作为:打开应用安装列表.找到要屏蔽的应用(长按通知,点击弹出的"应用信息",就可以跳到应用信息界面),把同意推送消息(显示通知)取消就可以. 产品发现这个功能之后,果断要求屏蔽.能力有限,不知道怎样破通知的屏蔽.自己实现一个Toast还是小case的-- Toast的实现非常快想到两种方案.Dialog和浮窗(WindowManager).Dialog怀疑代价可能比較大,因此没有去尝试.直接来看浮窗

Toast的延迟时间

一般显示Toast都是一条语句够了 Toast.makeText(Context context, CharSequence text, int duration) Context是要显示Toast的activity所在应用程序的上下文 text是显示的文本 duration是显示的时间 在源码中可以看到 路径android4.0\frameworks\base\services\java\com\android\server\NotificationManagerService.java pr

新建Activity、Toast、Menu

1.新建Activity 新建Activity->创建布局->在AndroidManifest文件中注册 (1)每个活动都要重写Activity的OnCreate方法 (2)res-New-Directory(创建layout目录)--->Layout resource file(创建布局资源文件) --->在活动中的OnCreate方法中加载布局 (3)所有的活动均要在AndroidManifest.xml中注册才能生效 2.Toast的使用 3.Menu的使用 (1)在res下

活动中使用提示框(Toast)

任务名称:活动中使用Toast 任务现象:点击button时,会弹出提示框:You Click Button 步骤 1.创建一个项目,新建活动和加载布局.参考: http://8c925c9a.wiz03.com/share/s/2cABOq0BC4HP2LGV_j2dj_pL2PmFkt3XSkVX2GjSRG3a9rRL 2.定义一个Toast的触发点,可以让按键点击的时候弹出这个Toast protectedvoid onCreate(Bundle savedInstanceState){

自定义Toast,显示号码归属地的 CustomToast

public class CustomToast implements OnTouchListener { private Context mContext; private View view; private WindowManager windowManager; private int startX; private int startY; private WindowManager.LayoutParams params; public CustomToast(Context cont

Android中土司(Toast)的使用

 Android中Toast的使用 什么是土司(Toast)? Toast是Android系统提供的一种非常好的提示方式,在程序中可以使用它将一些短小的信息通知给用户,这些信息会在一段时间后自动消失,并且不会占用任何的屏幕空间. 下面我们通过代码来体验一下土司在Android中的使用 1 import android.app.Activity; 2 import android.content.Intent; 3 import android.os.Bundle; 4 import androi

android API文档查询---context、toast、SharedPreferences

/*查阅api ---context1.abstract AssetManager     getAssets() Returns an AssetManager instance for the application's package. 得到assets目录下的资源 2.abstract File     getCacheDir() Returns the absolute path to the application specific cache directory on the fi

User Interface 之自定义Toast

通过Toast的setView(View view)方法可以将Toast的内容设为任意视图 eg: toast_layout.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout android:id="@+id/toast_layout_root" xmlns:android="http://schemas.android.com/apk/res/andro