我正在开发一个应用程序。在那一个屏幕上检查Internet连接,紧接在onCreate()方法之后。如果网络连接良好,我正在为加载国家列表调用一个AsyncTask类,并在spinnerView中在屏幕上显示它。如果没有网络连接,我向用户显示Toast Message并调用check_Network(AsyncTask)。在这个类受保护的Long doInBackground(URL ... params)方法我检查网络连接与否如果连接的呼叫国家AsyncTask,否则我再次调用check_Network(AsyncTask)。此过程重复,直到网络连接。我的问题是重复检查网络是正确的方法。请建议我。抱歉,我的英语很差,请理解。我正在展示我的代码
if (CheckNetwork.isOnline(this)) {
try {
new CountryProcess().execute();
} catch (Exception e) {
e.printStackTrace();
}
} else {
Toast.makeText(
getApplicationContext(),
getString(R.string.network_connection_fail)
+ "!", Toast.LENGTH_LONG).show();
new NetWork_connectivity().execute();
}
//.......................//
class NetWork_connectivity extends AsyncTask<URL, Integer,Long>
{
@Override
protected Long doInBackground(URL... params)
{
if (CheckNetwork.isOnline(MainActivity.this)) {
new CountryProcess().execute();
}else
{
new NetWork_connectivity().execute();
}
return null;
}
}
答案 0 :(得分:8)
在清单中添加以下代码,用于添加具有连接更改意图的接收器
<receiver android:name=".NetworkStateReceiver">
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
</receiver>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
在接收方,获取与意图相关的额外内容并检查状态。因此,只要网络状态发生变化,您就会收到通知,然后相应地执行您的任务。
public class NetworkStateReceiver extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
super.onReceive(context, intent);
if(intent.getExtras()!=null) {
NetworkInfo ni=(NetworkInfo) intent.getExtras().get(ConnectivityManager.EXTRA_NETWORK_INFO);
if(ni!=null && ni.getState()==NetworkInfo.State.CONNECTED) {
//connected
}
}
if(intent.getExtras().getBoolean(ConnectivityManager.EXTRA_NO_CONNECTIVITY,Boolean.FALSE)) {
//not connected
}
}
}
对于您的情况,您希望在清单中添加权限并在活动中注册接收者。
IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
registerReceiver(networkReceiver, filter);
确保在使用
离开活动之前取消注册unregisterReceiver(networkReceiver);
private BroadcastReceiver networkReceiver = new BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
super.onReceive(context, intent);
if(intent.getExtras()!=null) {
NetworkInfo ni=(NetworkInfo) intent.getExtras().get(ConnectivityManager.EXTRA_NETWORK_INFO);
if(ni!=null && ni.getState()==NetworkInfo.State.CONNECTED) {
//connected
}
}
//not connected
}
}
根据您的要求,您只需要一次连接状态。首先检查连接性,如果没有连接则只注册接收器。
public boolean isNetworkConnected() {
ConnectivityManager cm =
(ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo netInfo = cm.getActiveNetworkInfo();
if (netInfo != null && netInfo.isConnectedOrConnecting()) {
return true;
}
return false;
}
答案 1 :(得分:1)
要访问互联网,我们需要INTERNET许可
要检测网络状态,我们需要ACCESS_NETWORK_STATE权限
在AndroidManifest.xml中添加以下行:
<!-- Internet Permissions -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- Network State Permissions -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
在java类中创建此方法:
public boolean isConnectingToInternet(){
ConnectivityManager connectivity = (ConnectivityManager) _context.getSystemService(Context.CONNECTIVITY_SERVICE);
if (connectivity != null)
{
NetworkInfo[] info = connectivity.getAllNetworkInfo();
if (info != null)
for (int i = 0; i < info.length; i++)
if (info[i].getState() == NetworkInfo.State.CONNECTED)
{
return true;
}
}
return false;
}
当您想要在应用程序调用{{1}}函数中检查Internet状态时,它将返回true或false
isConnectingToInternet()