0

在我的应用程序中切换片段之前,我通过 Toast 提供用户反馈。一旦 Toast 出现,它就永远不会清除。退出 Activity 或杀死整个事物是清除 Toast 的唯一方法。

我试图在提交 FragmentTransaction 后保留对 Toast 的引用并调用 cancel(),但是当我这样做时,Toast 根本不会出现。

我添加了日志记录,并确定 Toast 只显示一次,而不是循环或重复显示。否则,该应用程序仍然可以响应,并且不会挂起。当我退出应用程序时,由于 onStop() 中的 cancel(),Toast 会被清除。

public final class MyActivity extends SherlockFragmentActivity {

    Toast toast = null;

    //...

    @Override
    protected void onStop () {
        if (toast != null) toast.cancel();
        toast = null;
        super.onStop();
    }

    //...

    private final class MyServiceReceiver extends ResultReceiver {

        public MyServiceReceiver(Handler handler) {
            super(handler);
        }

        @Override
        protected void onReceiveResult(int resultCode, Bundle resultData) {
            if (resultCode == MY_ERROR_CODE) {
                toast = Toast.makeText(getApplicationContext(), "my error message", Toast.LENGTH_SHORT);
                toast.show();

                FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
                ft.setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out,
                            android.R.anim.fade_in, android.R.anim.fade_out);
                ft.replace(R.id.main_layout, new MyFragment());
                ft.commit();

                //if (toast != null) toast.cancel();
                //toast = null;
            }
        }

    }

}
4

2 回答 2

0

这里的问题是 IntentService 正在调用 ResultReceiver,因此 Toast 是在 UI 线程之外创建的。 看到这个帖子

为了解决这个问题,我为 Activity 创建了一个处理程序并在那里制作 Toasts。作为奖励,我似乎不必管理对 Toast 的引用并清除 Activity.onStop。

于 2013-06-03T18:20:58.090 回答
0

您正在将应用程序上下文传递给您的 Toast,toast 生命周期将与您的应用程序的上下文相关联。你应该传递你当前的活动。

toast = Toast.makeText(this, "我的错误信息", Toast.LENGTH_SHORT);

toast.show();

于 2013-06-01T03:59:09.590 回答