Java 在后台查看互联网-Android

Java 在后台查看互联网-Android,java,android,multithreading,android-internet,Java,Android,Multithreading,Android Internet,我一直在做一些研究,并看到了一些关于是否使用广播接收器或报警管理器的争论,我不确定该使用什么,但以下是我正在尝试做和已经做的 我有一种方法可以检查是否有互联网连接。然后相应地更新UI public void isNetworkAvailable() { ConnectivityManager manager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo net

我一直在做一些研究,并看到了一些关于是否使用广播接收器或报警管理器的争论,我不确定该使用什么,但以下是我正在尝试做和已经做的

我有一种方法可以检查是否有互联网连接。然后相应地更新UI

public void isNetworkAvailable() {
    ConnectivityManager manager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo networkInfo = manager.getActiveNetworkInfo();

    if (networkInfo != null && networkInfo.isConnected()) {
        mLayout.removeView(noInternetView);
        checkInternetViewOpen = false;
    } else {
        if (!checkInternetViewOpen) {
            checkInternetViewOpen = true;
            mLayout.addView(noInternetView, params);
        }
    }
}
当我正在进行一项使用互联网的活动时,我想每隔几秒钟运行一次,以确保互联网仍然处于活动状态。像这样

while (usingInternet) {
    //I need to make it wait
    isNetworkAvailable();

}
我也需要不在主线程上,所以我可以让它等待,然后我将调整更新主线程上的UI部分

那么,我如何在后台线程上实现这一点呢?我应该使用什么选项


提前感谢您的帮助。

据我所知,您希望检查Internet连接,如果已连接,则必须在后台或UI线程上执行某些操作

因此,我建议您编写广播接收器以更改连接 如果连接了服务类,则启动服务

在该服务中,编写一个将在某个特定时间段后运行的TimerTask
在TimerTask中,您可以在共享pref上写入数据,当用户打开应用程序时,您可以从共享数据更新UI,您可以创建一个后台线程来检查此任务。这是我的示例代码

您只需要完成setNetworkAvailableUI()、setNetworkNotAvailableUI()和设置网络检查间隔

private boolean isCheckNetworkThreadActive = false; // Flag to indicate if thread is active
private boolean isNetworkAvaiableUIActive = false; // Flag to indicate which view is showing
final private static int NETWORK_CHECK_INTERVAL = 5000; // Sleep interval between checking network

@Override
protected void onResume() {
    // Start network checking when activity resumes
    startCheckNetwork();
    super.onResume();
}

@Override
protected void onPause() {
    // Stop network checking when activity pauses
    stopCheckNetwork()
    super.onPause();
}

private void setNetworkAvaiableUI() {
    // If network avaible UI is not showing, we will change UI
    if (!isNetworkAvaiableUIActive) {
        isNetworkAvaiableUIActive = true;
        runOnUiThread(new Runnable() {
            public void run() {
                // Update UI here when network is available.
            }
        });
    }
}
private void setNetworkNotAvaiableUI() {
    // If network avaible UI is showing, we will change UI
    if (isNetworkAvaiableUIActive) {
        isNetworkAvaiableUIActive = false;
        runOnUiThread(new Runnable() {
            public void run() {
                // Update UI here when network is unavailable.
            }
        });
    }
}

private void startCheckNetwork() {
    // Only one network checking thread can be run at the time.
    if (!isCheckNetworkThreadActive) {
        isCheckNetworkThreadActive = true;

        Thread checkNetworkThread = new Thread(new Runnable() {
            @Override
            public void run() {
                while (isCheckNetworkThreadActive) {
                    if (isNetworkAvailable()) {
                        // Set UI if notwork is available
                        setNetworkAvaiableUI();
                    } else {
                        // Set UI if notwork is not available
                        setNetworkNotAvaiableUI();
                    }

                    // Sleep after finish checking network
                    try {
                        Thread.sleep(NETWORK_CHECK_INTERVAL);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        });
        checkNetworkThread.setName("Check Network Thread");
        checkNetworkThread.start();
    }
}

private void stopCheckNetwork() {
    // This will break while loop of network checking thread.
    isCheckNetworkThreadActive = false;
}

您还可以通过使用计时器和处理程序来缩短代码,这是选项。

案例1:在整个应用程序中检查互联网状态

扩展应用程序类并在其中添加广播接收器

public class MyApplication extends Application {

public static boolean isConnected = false;
/**
 * To receive change in network state
 */
private BroadcastReceiver NetworkStatusReceiver = new BroadcastReceiver() {

    @Override
    public void onReceive(Context context, Intent intent) {

        ConnectivityManager connMgr = (ConnectivityManager) context
                .getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();

        isConnected = networkInfo != null && networkInfo.isConnectedOrConnecting();

        if (!isConnected) {
            Toast noInternetToast = Toast.makeText(getApplicationContext(),
                    R.string.no_internet_msg, Toast.LENGTH_LONG);
            noInternetToast.show();
        }
    }
};

@Override
public void onCreate() {
    super.onCreate();
    /** Register for CONNECTIVITY_ACTION broadcasts */
    registerReceiver(NetworkStatusReceiver, new IntentFilter(
            ConnectivityManager.CONNECTIVITY_ACTION));
}

@Override
public void onTerminate() {
    super.onTerminate();
    unregisterReceiver(NetworkStatusReceiver);
}
}
应用程序中的AndroidManifest.xml

<application
    android:name=".MyApplication"
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
</application>
案例2:在活动或片段内


只需在每个需要internet状态的活动或片段中添加广播接收器。

可以肯定的是,如果要更新UI,不能从后台线程执行。@Nabin是的,我知道,我说过我将来会编辑它。要重复操作,请使用Handler类use runOnUiThread()方法,从后台更新UI的步骤thread@Nabin你能添加更多吗?我也需要在背景线程上添加它。你可以按照这一页查找TimerTask和广播接收器的答案。我看过广播接收器的例子,但我如何称呼它?广播接收在后台线程上吗?广播接收在Internet连接状态更改时自动调用,无需显式调用,所以我只需创建类并且从不调用它?它是在后台线程还是UI线程上?你只需从广播接收器的onReceive()方法调用TimerTask,我需要添加
checkNetworkThread.interrupt()退出时正确,否则while循环将停止,但线程未消失?我找不到一个好方法在退出时停止线程,因为
线程。停止已被弃用。您不需要中断线程,因为当stopCheckNetwork()时run isCheckNetworkThreadActive变为false,while循环将停止,线程将停止,因为while循环之后没有任何东西可以运行。下次要再次检查时,只需将isCheckNetworkThreadActive设置为true,然后再次启动线程。仅供参考,活动暂停时将调用stopCheckNetwork(),您可以将其移动到任何位置。如果我退出应用程序,然后重新输入,
onResume
将被调用-->
startCheckNetwork()
然后尝试从退出处再次启动线程,作为
isCheckNetworkThreadActive=false
。但是,如果在调用
startCheckNetwork()
之前设置了
isCheckNetworkThreadActive=true
,则while循环不会再次启动?我知道,在这种情况下,将整个线程移动到startCheckNetwork,并在isCheckNetworkThreadActive=true;之后粘贴它;。这将使线程每次都被创建。很抱歉,因为我有类似的代码段,但我没有尝试在方法之外创建线程。我已经编辑了答案。
if(MyApplication.isConnected){
   /** Do your network operation **/
}