6

我有一条执行后不会消失的敬酒消息。我猜这与它在循环中有关,但我不确定。有人可以帮我弄清楚为什么吐司消息没有区别吗?

 @Override
public void onClick(View v) {
    int index = 0;
    for(int i= 0; i<userArray.length; i++){
        if(email.getText().toString().equals(userArray[i])){
            index = i;
        }
        if(passArray[index].equals(password.getText().toString())){
            Toast.makeText(getBaseContext(), "SUCCESS!", Toast.LENGTH_SHORT).show();

        } else {
            Toast.makeText(getBaseContext(), "INVALID LOGIN", Toast.LENGTH_SHORT).show();
        }
    }
    Intent mainIntent = new Intent(LoginActivity.this, MainActivity.class);
    startActivityForResult(mainIntent, 0);
}

}

4

10 回答 10

13

如果您从服务线程调用 Toast 消息并且该线程在 Toast 设置为消失之前完成它的工作,则该消息可能会卡住。然后,您会被屏幕上的 Toast 消息卡住,直到您终止应用程序。

于 2013-10-30T23:15:30.460 回答
4

Toast总是消失。总是。

因此,您将显示多条 Toast 消息。保证。通过使用某种计数器更改消息或在显示初始消息后禁用来测试这一点。

请注意,相当多的 Toast 可以堆叠起来,并且需要很长时间才能完成背靠背的显示。等待,只要您的应用程序没有无限循环,它们最终会消失。

编辑:我一直纠正。显然,Toast如果从 Thread、Service 或 IntentService 启动,消息可能会卡住并保持显示。谢谢@Johnathan 和@zapotec。

于 2013-03-21T05:54:25.527 回答
4

AToast并不总是消失。

“如果您从服务线程调用它,并且该线程在 Toast 设置为消失之前完成了它的工作,那么您将被屏幕上的 Toast 消息卡住,直到您终止应用程序。”

(从Jonathan Cole的原始答案中复制,不幸的是被删除了)


这是一个示例堆栈跟踪,解释了这种情况是如何发生的:

  java.lang.IllegalStateException: Handler (android.os.Handler) {123f93ea} sending message to a Handler on a dead thread
      at android.os.MessageQueue.enqueueMessage(MessageQueue.java:325)
      at android.os.Handler.enqueueMessage(Handler.java:631)
      at android.os.Handler.sendMessageAtTime(Handler.java:600)
      at android.os.Handler.sendMessageDelayed(Handler.java:570)
      at android.os.Handler.post(Handler.java:326)
      at android.widget.Toast$TN.hide(Toast.java:387)
      at android.widget.Toast.cancel(Toast.java:133)
于 2016-05-09T07:57:13.810 回答
1

我有这个问题。我发现我实例化了 10 多个 toast。每个都等到下一个消失后再显示下一个,屏幕上总共有 20 秒。

我发现将所有 toast 存储在一个数组列表中,然后将它们全部取消可以解决我的问题。

private ArrayList<Toast> toasts;
public void sendToast(final String message) {
    if (null == toasts) {
        toasts = new ArrayList<Toast>();
    }
    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            try {
                Toast toast = Toast.makeText(NJActivity.this, message, Toast.LENGTH_SHORT);
                toast.setGravity(Gravity.TOP|Gravity.CENTER, 0, 300);
                toast.show();
                toasts.add(toast);
            } catch(Exception e) {/* do nothing, just means that the activity doesn't exist anymore*/}
        }
    });
}


public void removeToast() {
    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            if (null != toasts) {
                for(Toast toast:toasts) {
                    toast.cancel();
                }
                toasts = null;
            }
        }
    });     
}

然后在停止销毁时我调用了 removeToast() 方法

@Override
public void onDestroy() {
    super.onDestroy();
    removeToast();
}

@Override
protected void onStop () {
    super.onStop();
    removeToast();
}
于 2014-05-27T23:36:28.177 回答
1

有一些奇怪的情况,吐司不会消失。为了处理这个,只需使用处理程序。创建一个作为字段,并使用“post(Runnable)”并在此处显示 toast。

于 2015-03-13T15:25:16.007 回答
1

这是我使用自定义吐司处理程序的解决方案。在 m 应用程序中完美运行。

public class CustomToast {

    private LayoutInflater inflater;
    private Toast toast;
    private View customToastLayout;
    private TextView LblCustomToast;

    public CustomToast() {}

    public void showCustomToast(String toastMessage, int toastLength, AppCompatActivity context) {

        if(inflater == null) {inflater = context.getLayoutInflater();}
        if(customToastLayout == null) {customToastLayout = inflater.inflate(R.layout.toast_layout, (ViewGroup) context.findViewById(R.id.toast_layout_root));}
        if(LblCustomToast == null) {LblCustomToast = (TextView) customToastLayout.findViewById(R.id.LblCustomToast);}
        LblCustomToast.setText(toastMessage);
        if(toast == null) {toast = new Toast(context);}
        toast.setGravity(Gravity.CENTER_VERTICAL| Gravity.BOTTOM, 0, DPDensity.getPxFromDP(160, context.getResources()));
        toast.setDuration(toastLength);
        toast.setView(customToastLayout);
        if(toast.getView().isShown()) {toast.cancel();}//Toast is cancelled here if currently showing
        toast.show();

    }

}

这是 XML 布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/toast_layout_root"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:paddingLeft="15dp"
    android:paddingTop="5dp"
    android:paddingRight="15dp"
    android:paddingBottom="5dp"
    android:orientation="vertical"
    android:background="@drawable/custom_toast_bg"
    android:gravity="bottom|center"
    android:layout_marginBottom="50dp">

    <TextView android:id="@+id/LblCustomToast"
        android:text="Test"
        android:textSize="16dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="@color/lightLime"
        android:layout_gravity="center"
        android:gravity="center"/>

</LinearLayout>

这是用法:

customToast = new CustomToast();
customToast.showCustomToast(getString(R.string.your_message), Toast.LENGTH_SHORT, (AppCompatActivity) mainActivityContext);
于 2016-08-28T22:31:47.390 回答
0

我以前遇到过同样的问题,这对我有帮助。我在 onCreate 中创建了我的 Toast,就像这样

public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_sample);

    Context context = getApplicationContext();
    CharSequence text = "~I'm a toast that will dissapear~!";
    int duration = Toast.LENGTH_SHORT;
    Toast toast = Toast.makeText(context, text, duration);
    toast.setGravity(Gravity.TOP, 0, 0);}

然后我只是从在不同线程上运行的方法中调用它

toast.show();

我希望它可以帮助!

PS我认为问题在于您的吐司是在一个线程上创建并从另一个线程(uithread)调用的

于 2019-12-07T13:13:42.450 回答
-1
  I m guessing it has something to do with it being in the loop but I'm not sure.

是的,你是对的,它的出现是因为你已经将它保持在for循环中,所以循环将执行多次,它会出现很多次Toast

您在代码中多次显示 Toast。

如果您不想多次烤面包,我会更好,然后您可以将其写在 for 循环之外。

于 2013-03-21T05:57:04.290 回答
-1

我认为问题是吐司一次又一次地出现在屏幕上,并且需要时间来消除。将 toast 置于循环之外,检查您的代码,并多次检查条件是否为真。总之就是DEBUG你的代码。

于 2013-03-21T06:02:21.060 回答
-1

吐司停留的时间更长一些。它一旦生成就会永远消失。在循环中,它们不断地相互生成,所以它给你一种永远在那里的错觉。如果您保持耐心并等待一段时间,所有这些都会在一段时间后消失。

如果要显示成功消息。

尝试制作alert dialogue并继续更新有关Text View您希望在成功和失败时显示的成功消息的消息。

Toast或仅在登录失败时尝试提高。

或者检查Infintie Loop您是否要坚持相同的方法

于 2013-03-21T06:04:03.410 回答