【发布时间】:2013-10-03 08:27:23
【问题描述】:
我的应用程序出现问题。我想要的是:
MainActivity 启动并创建一个定期检查 WiFi 服务是否启用的计划线程。如果是的话,去一个新的活动。如果不是,则发出警告并将用户带到 WiFi 设置页面。
当用户返回主 Activity 时,MainActivity 代码现在将感知 WiFi 服务已启用并将它们发送到第二个 Activity。
我有这个工作。代码如下:
@Override
protected void onResume()
{
super.onResume();
ScheduledExecutorService oScheduledExecutor = Executors.newSingleThreadScheduledExecutor();
try
{
oScheduledExecutor.scheduleAtFixedRate({RUNNABLE HERE}, 0, 5, TimeUnit.SECONDS);
}
catch (Exception e)
{
System.out.println("(MainActivity) Caught Exception here. #1");
System.out.println("(MainActivity) Error: " + e.getMessage() + " Cause: " + e.getCause());
e.printStackTrace();
}
}
@Override
protected void onStart()
{
super.onStart();
// Assign WifiManager to System service
oWiFiManager = (WifiManager) getSystemService(WIFI_SERVICE);
// Create Runnable
oWiFiUpdater = new Runnable() {
@Override
public void run()
{
// If we should show WiFi Disabled
if (shouldShowWiFiAlert())
{
runOnUiThread(new Runnable() {
@Override
public void run() {
launchWiFiDisabledAlert();
}
});
}
Intent oAPListIntent = new Intent(getApplicationContext(), APList.class);
startActivity(oAPListIntent);
}
}
};
但是,当我们进行第二个活动时,第一个线程仍在运行。我以为当 Activity 从 View 中移除时,所有线程都停止运行??
我希望执行程序仅在 Activity 可见时运行!有什么想法!?
编辑:感谢 njzk2 的灵感来回答
@Override
protected void onResume()
{
super.onResume();
createWiFiAlertDialog();
boolean bWiFiEnabling = wifiEnabling();
while (bWiFiEnabling)
{
try
{
doSyncedWait(500);
}
catch (Exception e)
{
System.out.println("(MainActivity) Exception caught waiting. " + e.getMessage());
}
bWiFiEnabling = wifiEnabling();
}
boolean bWiFiEnabled = wifiReady();
if (!bWiFiEnabled)
{
runOnUiThread(new Runnable() {
@Override
public void run() {
AlertDialog oAlertDialog = m_oAlertDialog;
oAlertDialog.show();
}
});
}
else
{
Intent oIntent = new Intent(this,APList.class);
startActivity(oIntent);
}
}
private boolean wifiEnabling()
{
WifiManager oWiFiManager = m_oWiFiManager;
if (oWiFiManager == null) return false;
if (oWiFiManager.getWifiState() == WifiManager.WIFI_STATE_ENABLING) return true;
return false;
}
private boolean wifiReady()
{
WifiManager oWiFiManager = m_oWiFiManager;
if (oWiFiManager == null) return false;
// If the WiFi state is anything other than enabled, then wait.
if (oWiFiManager.getWifiState() == WifiManager.WIFI_STATE_ENABLED) return true;
return false;
}
【问题讨论】:
-
所以它会定期将用户发送到 wifi 设置页面?我不太明白。为什么不简单地在活动的 onResume 中测试 wifi 状态,并在需要时让用户离开或转到 wifi 设置?
-
啊,太棒了!令人惊讶的是,对事物的不同看法!那和我是一个完整的Android新手的事实。干杯!
标签: java android multithreading android-activity