【问题标题】:Android application structure: Scheduled ThreadsAndroid 应用结构:Scheduled Threads
【发布时间】: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


【解决方案1】:

如果你给你的runnable一个activity的引用,并在onResume()false中设置一个布尔值trueonPause(),你应该能够从你的runnable引用布尔值,然后使用if 语句仅在布尔值设置为 true 时运行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-18
    • 1970-01-01
    • 1970-01-01
    • 2011-10-07
    • 2011-08-24
    相关资源
    最近更新 更多