0

アプリに問題があります。私が欲しいのは:

MainActivity は、WiFi サービスが有効になっているかどうかを定期的にチェックするスケジュールされたスレッドを起動および作成します。ある場合は、新しいアクティビティに進みます。そうでない場合は、警告を表示し、ユーザーを WiFi 設定ページに移動します。

ユーザーがメイン アクティビティに戻ると、MainActivity コードは WiFi サービスが有効になっていることを検出し、それらを 2 番目のアクティビティに送信します。

私はこれを機能させています。コードは次のとおりです。

@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);
            }
        }
};

ただし、2 番目のアクティビティを実行しているときは、最初のスレッドがまだ実行されています。アクティビティがビューから削除されると、すべてのスレッドの実行が停止すると思いました??

アクティビティが表示可能な場合にのみエグゼキュータを実行したい! 何か案は!?

編集: 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;
}
4

1 に答える 1

0

ランナブルにアクティビティへの参照を与え、ブール値をtrueinonResume()およびfalseinに設定するとonPause()、ランナブルからブール値を参照し、ブール値が true に設定されている場合にのみ if ステートメントを使用して実行できるはずです。

于 2013-10-03T08:41:24.157 に答える