持久Toast消息:Toast在执行后不会消失

时间:2013-03-21 05:52:56

标签: android toast

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

 @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);
}

}

10 个答案:

答案 0 :(得分:10)

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

答案 1 :(得分:3)

Toast总是消失。总是

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

请注意,相当多的Toast可以叠加并花费一些时间来完成背对背显示。等等,只要你的应用程序没有无限循环,它们最终就会消失。

编辑:我纠正了。显然,如果从线程,服务或IntentService启动,Toast消息可能会卡住并保持显示状态。谢谢@Johnathan和@zapotec。

答案 2 :(得分:2)

Toast并不总是消失。

“如果你从一个服务线程调用它并且该线程在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)

答案 3 :(得分:1)

我有这个问题。我发现的是我实例化了10多个祝酒词。在显示下一个之前,每个等待直到下一个消失,屏幕上总共20秒。

我发现在arraylist中存储所有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();
}

答案 4 :(得分:1)

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

答案 5 :(得分:1)

这是我的自定义Toast处理程序的解决方案。在m app中完美运行。

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);

答案 6 :(得分: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();

我希望它能有所帮助!

P.S。我认为问题是您的吐司是在一个线程上创建的,而从另一个线程(uithread)调用的

答案 7 :(得分:-1)

  I m guessing it has something to do with it being in the loop but I'm not sure.

是的,你是正确的,因为你已经将它保存在for循环中,因此很多时候循环将在Toast出现的很多时间执行。

您在代码中多次显示Toast。

如果您不想多次敬酒,那么我会更好,然后您可以将它写在for循环旁边。

答案 8 :(得分:-1)

我认为问题是烤面包在屏幕上一次又一次出现,并且花时间解雇。检查你的代码再看看toast外循环,并检查条件是否真实多次。简而言之,只需DEBUG您的代码。

答案 9 :(得分:-1)

吐司停留的时间更长。一旦生成,它将永远消失。 因为它们在循环中不断地相互产生,所以它给你一种永远存在的幻觉。 如果你保持耐心并等待一段时间,一段时间后它们就会消失。

如果您想显示成功消息。

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

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

如果您想坚持使用相同的方法,请检查Infintie Loop