美文网首页Android 轮子Android技术进阶我的测试收藏
「Android Tips」Toast 的一些使用技巧

「Android Tips」Toast 的一些使用技巧

作者: _Ryeeeeee | 来源:发表于2015-07-22 23:59 被阅读1722次

改变 Toast 的位置


Toast toast = Toast.makeText(this, "Gravity", Toast.LENGTH_SHORT);
toast.setGravity(Gravity.BOTTOM|Gravity.RIGHT, 0, 0);
toast.show();

自定义 Toast 的布局


LayoutInflater inflater = getLayoutInflater();
# 解析自定义布局,父布局传入肯
View layout = inflater.inflate(R.layout.toast_layout, (ViewGroup) findViewById(R.id.toast_layout_root));
# 填充信息,比如设置文字,图片等
TextView text = (TextView) layout.findViewById(R.id.text);
text.setText("This is a custom Toast.");
# 显示 Toast
Toast toast = new Toast(getApplicationContext());
toast.setDuration(Toast.LENGTH_LONG);
toast.setView(layout);
toast.show();

避免内存泄露


下列这段简单的代码,居然可能会出现内存泄露!

Toast.makeText(MainActivity.this, "Hello", Toast.LENGTH_SHORT).show();

原因在于:如果在 Toast 消失之前,Toast 持有了当前 Activity,而此时,用户点击了返回键,导致 Activity 无法被 GC 销毁, 这个 Activity 就引起了内存泄露.

一个很简单的解决方法:所有只要和布局无关的 Context 都可以传入 ApplicationContext, 此避免内存泄露的方法同样试用于其他需要传入 Context 的地方。就像这样:

Toast toast = Toast.makeText(getApplicationContext(), "Gravity", Toast.LENGTH_SHORT);

显示时间只有 LENGTH_SHORT, LENGTH_LONG 可以选择


frameworks/base/services/java/com/android/server/NotificationManagerService.java 查看源码可以发现,没有其他显示时间长度可以选择。

private static final int LONG_DELAY = 3500; // 3.5 seconds
private static final int SHORT_DELAY = 2000; // 2 seconds
private void scheduleTimeoutLocked(ToastRecord r) {
    mHandler.removeCallbacksAndMessages(r);
    Message m = Message.obtain(mHandler, MESSAGE_TIMEOUT, r);
    long delay = r.duration == Toast.LENGTH_LONG ? LONG_DELAY : SHORT_DELAY;
    mHandler.sendMessageDelayed(m, delay);
}

show() 方法其实是入队操作


/**
 * Show the view for the specified duration.
 */
public void show() {
    if (mNextView == null) {
        throw new RuntimeException("setView must have been called");
    } 
   INotificationManager service = getService();    String pkg = mContext.getOpPackageName();
    TN tn = mTN;
    tn.mNextView = mNextView;
    try {
        service.enqueueToast(pkg, tn, mDuration);
    } catch (RemoteException e) {
        // Empty
    }
}

普通应用的 Toast 显示数量是有限制的


查看
frameworks/base/services/java/com/android/server/NotificationManagerService.java 中的入队方法
enqueueToast 发现非系统应用是有最大总数限制的,而系统应用没有

// 非系统Toast,每个pkg在当前mToastQueue中Toast有总数限制,不能超过MAX_PACKAGE_NOTIFICATIONS
if (!isSystemToast) {
    int count = 0;
    final int N = mToastQueue.size();
    for (int i=0; i<N; i++) {
        final ToastRecord r = mToastQueue.get(i);
        if (r.pkg.equals(pkg)) {
            count++;
            if (count >= MAX_PACKAGE_NOTIFICATIONS) {
                Slog.e(TAG, "Package has already posted " + count + " toasts. Not showing more. Package=" + pkg);
                return;
            }
         }
     }
 }

相关文章

  • 「Android Tips」Toast 的一些使用技巧

    改变 Toast 的位置 自定义 Toast 的布局 避免内存泄露 下列这段简单的代码,居然可能会出现内存泄露! ...

  • Android——Toast

    三、使用 1.Toast使用技巧 Toast使用技巧 (1)自定义 Toast 布局 (2)使用 Applicat...

  • Flutter使用Toast

    在Android开发中,我们经常使用原生的Toast展示一些提示。现在在iOS开发过程中,Toast的使用也变得越...

  • Android:活动中的提示 (Tosat) 和打印信息 (Lo

    一、Toast Toast 是 Android 系统提供的一种很好的提醒方式,在程序中可以使用它将一些简单的信息反...

  • android Toast 吐司 源码分析

    什么是土司(Toast)? Toast是Android系统提供的一种非常好的提示方式,在程序中可以使用它将一些短小...

  • Android Studio 使用技巧Tips

    持续更新ing,喜欢请点赞! 1. 从布局中快速高效地提取Style 2. 删除项目无用资源 在项目中,点击菜单栏...

  • SnackbarUtils:一行代码搞定Snackbar

    Snackbar在Android中的使用日益广泛,很大程度上替代了传统的Toast,相比Toast拥有更好的使用体...

  • Android studio 简单使用

    tips 本文旨在 简要阐述一些使用 Android studio中的一些坑 最新版下载 studio canar...

  • Android Toast 使用

    基本的使用 或者 設定顯示位置 自定義自己Toast xml (saved as layout/custom_to...

  • 2018-03-09

    Android Studio学习笔记 1、Toast的使用 toast 就是在界面上显示一个提示画面 它可以直接显...

网友评论

    本文标题:「Android Tips」Toast 的一些使用技巧

    本文链接:https://www.haomeiwen.com/subject/snnpqttx.html