在后台检查互联网 - 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 或需要互联网状态的片段中添加广播接收器。
我一直在做一些研究,看到一些关于是使用广播接收器还是警报管理器的争论,我不确定该使用什么,但这是我正在尝试做的和已经做过的。
我有一个方法可以检查是否有互联网连接。然后相应地更新 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 或需要互联网状态的片段中添加广播接收器。