【发布时间】: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