Java 持续互联网后台检查-Android

Java 持续互联网后台检查-Android,java,android,Java,Android,我写了一个类来检查是否有互联网连接,现在我想每隔1-2秒检查一次是否有互联网关闭特殊提示 我在扩展AsyncTask的活动中添加了类,并在此类中执行此操作。代码如下: public class NoInternet extends Activity { private ConnectionDetector cd; public Boolean isInternetPresent; public void onCreate(Bundle savedInstanceSta

我写了一个类来检查是否有互联网连接,现在我想每隔1-2秒检查一次是否有互联网关闭特殊提示

我在扩展AsyncTask的活动中添加了类,并在此类中执行此操作。代码如下:

public class NoInternet extends Activity {

    private ConnectionDetector cd;
    public Boolean isInternetPresent;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.nointernet);

        new RefreshTask().execute();
    }

    public void closeActivity() {
        super.onBackPressed();
        overridePendingTransition(0, 0);
    }

    @Override
    public void onBackPressed() {
    }

    class RefreshTask extends AsyncTask {

        @Override
        protected void onProgressUpdate(Object... values) {
            super.onProgressUpdate(values);
            String text = String.valueOf(System.currentTimeMillis());
            isInternetPresent = cd.isConnectingToInternet();

            if(isInternetPresent) {
                closeActivity();
            }

        }

        @Override
        protected Object doInBackground(Object... params) {
            while (!isInternetPresent) {
                try {
                    //sleep for 1s in background...
                    Thread.sleep(1000);
                    publishProgress();
                } catch (InterruptedException e) {
                    e.printStackTrace();

                };
            }
            return null;
        }
    }
}

而且它不能正常工作。。。有什么建议或提示吗?

你完全没有说明它是如何失败的

让我猜两种可能性:

  • 它会阻止所有后续的异步任务。使用
    execute(…)
    方法提交的AsyncTask将在后续任务启动之前运行到完成。由于此任务将永远运行,因此它将阻止后续任务
  • 这项任务最终被扼杀。当进程需要空间时,Android将终止进程,并且停止异步任务

  • 看看AlarmManager。你可以用它来安排重复的任务。

    这样做是错误的。首先,如果您一直在后台需要一些东西,请使用线程,而不是异步任务。它不仅更适合,而且使用AsyncTask会破坏其他AsyncTak,因为它们默认在单个线程上执行


    其次,它在电池和CPU方面比轮询更有效。使用BroadcastReceiver而不是轮询连接状态。

    您也可以尝试此服务类别。只需将时间间隔设置为秒,并将url设置为ping:


    请记住将服务添加到清单文件,并添加权限

    老实说,我现在不知道它是如何失败的。。。我猜第二个选项是应用程序冻结并被系统关闭。我不确定为什么应用程序会冻结,但它最终会被系统关闭。使用AlarmManager。
    AlarmManager
    不是定期触发代码(1-2秒)的好方法。此外,OP对他/她应该做什么有错误的想法。使用
    BroadcastReceiver
    是监视网络连接的常用方法。@Squonk足够公平。但是,如果您需要持久性通知,无论间隔多长,AlarmManager都是唯一的方法。在Android中,应用程序冻结并被系统关闭线程不是持久性的。你需要警报管理器。不,线程绝对是持久的。您认为AsyncTask是如何编写的?它是一个为您编写了runonUIThread块的线程。即使活动被破坏,它也会持续。不需要AlarmManager。线程或AlarmManager也不是正确的答案——他应该使用广播接收器。不,线程不是持久的。当进程被Android终止时,它就会被终止,因为它需要为其他应用程序留出空间。OP想要投票:AlarmManager就是这样做的。广播接收器也是一个很好的建议。然后我会检查广播接收器try@G.BlakeMeike首先,这不是他需要的——他需要在后台运行,而不是在应用程序退出后运行。其次,如果应用程序退出,那么警报也将被终止——在程序退出后唯一持续存在的是清单中列出的广播接收器。然而,一个线程将持续存在,只要它在其中启动的活动/服务存在,并且只要应用程序本身没有被杀死,它实际上将持续这两个线程中的任何一个。