在后台检查互联网 - Android

Check internet in background - Android

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

我有一个方法可以检查是否有互联网连接。然后相应地更新 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);
        }
    }
}

当我处于将要使用互联网的 activity 时,我想每隔几秒 运行 一次,以确保互联网仍然处于活动状态。像这样

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

}

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

那么我怎样才能在后台线程上做这个呢?我应该使用什么选项?

提前感谢您的帮助。

据我了解,您想检查 Internet 连接,如果已连接,则必须在后台或 UI 线程上执行某些操作。

所以我建议你编写Broadcast reciever for connection changes服务 class 如果已连接则启动服务。

在该服务中写入一个 TimerTask,它将在某个特定时间段后 运行。 在 TimerTask 中,您在共享 pref 上写入数据,当用户打开应用程序时,您可以从共享数据

更新 UI

您可以创建后台线程来检查此任务。这是我的示例代码。

您唯一要做的就是完成 setNetworkAvaiableUI()、setNetworkNotAvaiableUI() 和设置 NETWORK_CHECK_INTERVAL。

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

您还可以使用 Timer 和 Handler 使代码更短,这是选项。

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

扩展应用程序 class 并在其中添加一个广播接收器。

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>

在你的应用程序的任何地方,你都可以像

一样检查互联网
if(MyApplication.isConnected){
   /** Do your network operation **/
}

情况 2:在 activity 或片段中

只需在每个 activity 或需要互联网状态的片段中添加广播接收器。