1

Toastタブから別のタブに切り替えるときにa を「削除」しようとしているので、フォーカスされたタブのアクティビティを一時停止すると仮定します。基本的に、cancel メソッドを単一のToastオブジェクトに適用するか、null に割り当てることができます。これは機能します。

ポイントは、TextView を使用して Toast をスレッド化すると、スレッドを停止しても Toast が引き続き表示されることです。この時点からToast をスレッド化し、 this oneに従って停止しようとしました。

スレッドを停止してシステム キューからトーストを削除する方法、またはその目標を達成するためのより良い解決策がありますか (たとえば、1 つのアクティビティで複数のトースト、アクティビティから別のアクティビティに切り替えるときにトーストの表示を停止するなど)?


トーストを呼び出す (これで問題ありません):

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

トーストの表示と非表示は、handler. したがって、トーストを作成するスレッドは、トーストが破棄されるまで実行されている必要があるため、ハンドラーは破棄メッセージを処理できます。したがって、Toast in UI スレッドを作成します。

mySingleToastUi スレッドで作成されていることを確認します

編集: Ui スレッドでトーストを作成しているため、あなたの場合、あまりにも多くの 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 に答える