【问题标题】:Android: Toast is not showing before system.exit()Android:在 system.exit() 之前没有显示 Toast
【发布时间】:2016-02-23 06:38:51
【问题描述】:

我有嵌套的嵌套类,我试图在退出应用程序之前为最外层的类显示祝酒词。如果我注释掉 exit 语句,吐司就可以正常工作,所以我知道我正在正确访问上下文。我还尝试将 toast 放入一个线程中,它会休眠 2000 毫秒(exit 语句反之亦然),但这仍然不起作用。

我想做的只是显示一个祝酒词并退出程序。 (如果可能的话,最好同时进行......)

    public class A extends Service {


        private Context context;

       //...

        @Override
        public int onStartCommand(Intent intent, int flags, int startId) {

            context = this;
            //...
            return START_STICKY;
        }

        Handler disToast= new Handler(new Callback() {

             @Override
             public boolean handleMessage(Message msg) {
                Toast.makeText(context, "see ya", Toast.LENGTH_SHORT).show();
                return true;//also tried false, but that did not work...
            }
       });

       private Runnable r = new Runnable() {

          public void run() {


        new CountDownTimer(3000, 1000) {

            public void onFinish() {

                Message msg=disToast.obtainMessage();
                msg.obj="my message";
                disToast.sendMessage(msg);

                handler.removeCallbacks(updateTimerThread);
                System.exit(0);
            }
        }.start();//end of inner most class

     };//end of first inner class

 }//outermost class

编辑** 为什么所有的反对票?我没有使用任何活动(最外面的类是Service,两个内部是普通的 Java 类)所以一些答案(尽管我非常适合这些答案)不起作用。

【问题讨论】:

  • context = getApplicationConext();
  • 不要使用 System.exit
  • @barq 介意告诉我应该使用什么来终止程序吗?
  • @MD 我尝试这样做时收到“无法解析方法”错误...也许是因为最外面的类是服务?我不确定……

标签: android toast


【解决方案1】:

感谢所有尝试为我回答此问题的人,但不幸的是,解决方案不起作用。

当我尝试在Service 中使用Toast 时,我必须使用this

再次感谢那些尝试回答的人:谢谢。

对于那些没有说明原因而对我的帖子投了反对票的人,下次请留下建设性的批评,而不是让我蒙在鼓里。我是来学习的,如果您只是提供合法理由而投反对票,我将无法学习。我不是读心术。

【讨论】:

    【解决方案2】:

    使用 getApplicationConext() 代替上下文

    Toast.makeText(getApplicationConext(), "Timer up. Existing app...", Toast.LENGTH_SHORT).show();
    

    【讨论】:

    • 我在尝试时收到“无法解析方法”错误...可能是因为最里面的类不是活动?
    【解决方案3】:
    Handler disToast= new Handler(new Callback() {
       @Override 
       public void handleMessage(Message msg) { 
                 String mString=(String)msg.obj;
                 Toast.makeText(this, mString, Toast.LENGTH_SHORT).show();
              }
    });
    
     private Runnable r = new Runnable() {
    
    
        public void run() {
    
    
            new CountDownTimer(3000, 1000) {
    
                public void onFinish() {
    
    
    
                Message msg=disToast.obtainMessage();
                msg.obj="your message";
                disToast.sendMessage(msg);
    
                    handler.removeCallbacks(updateTimerThread);
                    System.exit(0);
                }
            }.start();
    
    };
    

    更多详情请参考Here

    【讨论】:

    • 感谢您的回复,我已经尝试过了(进行了一些修改以便编译),但它不起作用。我已经更新了我上面的代码...
    • 不幸的是,这也不起作用。我还应该注意,如果 makeText 的第二个参数是 Message 类型而不是 String,则会给我一个错误。
    • 消息 msg=disToast.obtainMessage(); msg.obj="你的消息"; disToast.sendMessage(msg);
    • 我试过了……没用。我又更新了代码
    • 感谢您的帮助,但这也不起作用。此外,handleMessage 将返回一个布尔值,假设它是从 android.os.Handler.Callback 导入的;
    【解决方案4】:

    请使用

    Toast.LENGTH_LONG 而不是

    Toast.LENGTH_SHORT
    
    
     Toast.makeText(context, "Timer up. Existing app...", Toast.LENGTH_LONG).show();
    

    现在你的 toast 将在 System.exit() 之后显示;

    【讨论】:

    • 感谢您的回复,但很遗憾,这不起作用。 :(
    猜你喜欢
    • 2015-06-15
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-30
    相关资源
    最近更新 更多