【问题标题】:Unable to use Toast message in loop in android无法在android中循环使用Toast消息
【发布时间】:2015-05-31 17:16:32
【问题描述】:

我正在制作一个android应用程序

1) 循环开始并检查是否存在连接

2)如果是,则执行TASK A并退出

3) 如果不是,它会显示一条 TOAST 消息 然后进入步骤 1

为了实现这一点,我尝试将我的 Toast 消息放在一个循环中并尝试

1)创建一个扩展Asynch Tasks的类并在doBackground()中显示Toast

2) 创建一个处理程序。我在 postDelayed 中显示了 Toast 消息

3)在runOnUiThread()中显示toast

他们都遭遇了同样的命运

对于较小的值(

对于较大的值(=30s),应用程序将强制关闭

  int t=0;
  while (!t=1)
            {
                ConnectionCheck2 cd = new ConnectionCheck2(mContext);
                Boolean isInternetPresent = cd.isConnectingToInternet();

                if (isInternetPresent)
                {
                  //TASK A
                    t=1;
                }
                else
                {
                    //made call to Handler, Asynch Tasks and runOnUiThread   here to display the Toast message below
     Toast.makeText(MainActivity.this,"Internet is NOT connected",
                      Toast.LENGTH_SHORT).show();

           }

}

类 ConnectionCheck 构造函数使用显示 toast 消息的类的上下文进行初始化。它有一个名为 isConnectingToInternet() 的方法,用于检查 Internet 连接是否存在。该类和函数的真实性已得到确认。

我试过了

public void doSomeWork()
{

 final Timer someTimer= new Timer ();
    someTimer.schedule (new TimerTask () {


        @Override
        public void run()
        {

           ConnectionCheck2 cd = new ConnectionCheck2(MainActivity.this.getApplicationContext());
            final Boolean isInternetPresent = cd.isConnectingToInternet();
            runOnUiThread (new Thread(new Runnable() {
             public void run()
             {
               if (isInternetPresent)
                  {

                    Change();
                    someTimer.cancel();


                  }
                         Toast.makeText(MainActivity.this.getApplicationContext(),"NOT Connected",Toast.LENGTH_SHORT).show();

                         }
                       }));
                        }
                    }, 1000, 5000);

                    if (g==1)
                    {
                     Toast.makeText(MainActivity.this.getApplicationContext(), "Internet is connected", Toast.LENGTH_SHORT).show();

                    }

          }//doSomeWork
                      public void Change()
                        {
                             g=1;

                          }

                //g is declared as a global variable

但是,如果我最初关闭网络并打开它,则不会显示 Internet 已连接

我将 toast 消息放在 runOnUithread() 但我的问题是,如果我删除控制条件,则控件首先转到显示“internet is connected”的 toast 消息(计时器后面的语句)然后到“未连接”的那个。此外,当找到 Internet 连接并执行 timer.cancel() 时,控件不会转到计时器后面的语句,而是退出。根据我的想法,首先应该执行计时器模块,然后应该执行它之后的语句,如果 timer.cancel() 条件为真

【问题讨论】:

  • toast 在第一种和第三种情况下肯定不可见。您需要将结果传递给 onPostExecute() 方法并在 uithread 上运行时在那里显示吐司,因此不需要第二种情况
  • 在 doInBackground() 中显示 Toast 应该会使您的应用程序崩溃,因为 doInBackground 不在 UIThread 上,但显示 Toast 应该在 UIThread 上。
  • 还有您到底需要什么?网络连接还是互联网连接?如果是后者,那么您真的需要一个不同的概念,而不是简单的 API 实现
  • @NicolasSimon 我认为辅助线程中的线程不是很好的实现。 onPostExecute() 是更好的选择
  • @therealprashant 我是说在 doInBackground 中显示 Toast 是个坏主意。无论如何,如果您没有互联网连接,您将创建一个无限循环,一次又一次地显示 Toast(这会使您的应用程序崩溃)

标签: java android multithreading android-asynctask android-handler


【解决方案1】:

虽然循环不是一个好方法,但您可以运行 TimerTask 以在每个指定的时间值之后运行。

Timer someTimer= new Timer ();
someTimer.schedule (new TimerTask () {
        @Override
        public void run () {
          // do your Checking here, for toast use runOnUIThread() or handler.

        }
    }, 0, 100);

注意事项:

  • 0 用于随叫随到
  • 100 是每 100 秒运行一次。

更新

    final Timer someTimer = new Timer ();
    someTimer.schedule (new TimerTask () {

        @Override
        public void run () {

            ConnectionCheck2 cd = new ConnectionCheck2 (MainActivity.this.getApplicationContext ());
            final Boolean isInternetPresent = cd.isConnectingToInternet ();
            runOnUiThread (new Thread (new Runnable () {
                public void run () {

                    if (isInternetPresent) {

                        Change ();
                        someTimer.cancel ();

                        return;
                    }
                    Toast.makeText (MainActivity.this.getApplicationContext (), "NOT Connected", Toast.LENGTH_SHORT).show ();

                }
            }));
        }
    }, 0, 5000);

    if (g == 1) {
        Toast.makeText (MainActivity.this.getApplicationContext (), "Internet is connected", Toast.LENGTH_SHORT).show ();

    }

}

【讨论】:

  • 我需要使用一个while循环,以便它检查直到找到网络连接并执行任务A。同时,我希望用户知道网络连接没有被执行吐司
  • 我将您的代码合并到 else 部分,它给了我一个 FORCE CLOSE 消息。
  • 我读过关于定时器的文章,我什至在这个程序本身中尝试过,但徒劳无功。但是,我有一个疑问,控件什么时候离开计时器?
  • No 不,不要使用 while 循环。
  • 哦等等.. timer.cancel()
猜你喜欢
  • 2011-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-08
  • 1970-01-01
  • 2014-01-07
  • 1970-01-01
相关资源
最近更新 更多