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