1

Toast当从一个选项卡切换到另一个选项卡时,我试图“删除”一个,因此假设暂停了焦点选项卡活动。基本上我可以将取消方法应用于单个Toast对象,或将其分配给 null。这行得通。

关键是当我使用 TextView 并线程化 Toast 时,即使我停止线程,Toast 仍然可见。我从这一点开始对 Toast 进行线程化,并试图根据这一点停止它。

如何停止线程并从系统队列中删除 toast,或者是否有更好的解决方案来实现该目标(例如,单个活动中的多个 toast,从一个活动交换到另一个活动时停止显示 toast)?


打电话祝酒(这没关系):

private void showSingleToast(String toastText, int color, long duration_ms) {


    if (mySingleToast instanceof Toast) {
        mySingleToast.setText(toastText);

        if (null != toastView)
            if (toastView instanceof TextView)
                toastView.setTextColor(color);

        ToastExpander.showFor(mySingleToast, duration_ms);
    }
}

线程化 Toast.show()

public class ToastExpander extends Thread {

    public static final String TAG = "ToastExpander";

    static Thread t;// = null;

    // Must be volatile:
    static volatile boolean stopFlag = false;
    static long scan_freq = 300;

    public static void showFor(final Toast aToast, final long durationInMilliseconds) {

        aToast.setDuration(Toast.LENGTH_SHORT);

        t = new Thread() {
            long timeElapsed = 0l;

            public void run() {
                try {
                    while (timeElapsed <= durationInMilliseconds || !stopFlag) {
                        long start = System.currentTimeMillis();
                        aToast.show();
                        sleep(scan_freq);
                        timeElapsed += System.currentTimeMillis() - start;
                    }

                    // doesn't work: aToast.cancel();

                } catch (InterruptedException e) {
                    Log.e(TAG, e.toString());
                }
            } /* end of "run" */

        }; /* end of Thread */

        t.start();



    } /* end showFor */

    public static void cancel() {
    stopFlag = true;
    }
}

试图“删除”吐司(不起作用)

private void hideSingleToast() {
    //hideTextView(toastView);
    toastView = null;
    ToastExpander.cancel();
    mySingleToast.cancel();
    //mySingleToast= null;


}
4

2 回答 2

1

Toast 显示和关闭是使用handler. 所以创建 toast 的线程应该一直运行到 toast 被解除,以便处理程序可以处理解除消息。所以在 UI 线程中创建 Toast。

确保mySingleToast在 Ui 线程中创建

编辑:由于您是在 Ui 线程中创建 toast,看起来,在您的情况下,太多的 atoast.show() 排队了。LENGTH_SHORT 通常显示 2 秒。在此期间,您添加了近 6-7 个节目。这就是为什么它继续显示。

你可以做的就是aToast.cancel()在之前添加aToast.show

于 2012-09-17T17:32:38.263 回答
0

这是我的工作解决方案。

public static void show(final Toast aToast, final String usr_msg, final long durationInMilliseconds,
            final TextView myView, final int myColor) {

    // Instanciate Toast
    aToast.setText(usr_msg);
    aToast.setDuration(Toast.LENGTH_SHORT);

    // Instanciate TV
    myView.setTextColor(myColor);

    t = new Thread() {
        long timeElapsed = 0l;

        public void run() {

            try {

                // Make sure view exists

                // Show Toast in the view
                while (!stopFlag) {
                    long start = System.currentTimeMillis();
                    aToast.show();
                    sleep(scan_freq);
                    timeElapsed += System.currentTimeMillis() - start;

                    // DEBUG
                    if (debug)
                        Log.e(TAG, "|__ Thread running since : " + timeElapsed + " ms");

                    if (timeElapsed >= durationInMilliseconds) {
                        stopFlag = true;
                        if (debug)
                            Log.e(TAG, "|__ Time elapsed - Process stopped");
                    }

                }




            } catch (InterruptedException e) {
                Log.e(TAG, "Catch : " + e.toString());
            }
        } /* end of "run" */

    }; /* end of Thread */

    t.start();

    // reset stopFlag for next Toast
    stopFlag = false;

} /* end showFor */
于 2012-09-18T10:01:01.033 回答