什么是在android中连续检查Internet连接的最佳方法

Raj*_*mar 3 java android android-asynctask

我正在开发一个应用程序.在那一个屏幕上检查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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

Anu*_*pam 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" />
Run Code Online (Sandbox Code Playgroud)

在接收方,获取与意图相关的额外内容并检查状态.因此,只要网络状态发生变化,您就会收到通知,然后相应地执行您的任务.

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
 }
}
}
Run Code Online (Sandbox Code Playgroud)

对于您的情况,您希望在清单中添加权限并在您的活动中注册接收者.

IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
    registerReceiver(networkReceiver, filter);
Run Code Online (Sandbox Code Playgroud)

在离开活动之前,请务必取消注册

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 
   }
}
Run Code Online (Sandbox Code Playgroud)

根据您的要求,您只需要一次连接状态.首先检查连接性,如果没有连接则只注册接收器.

public boolean isNetworkConnected() {
        ConnectivityManager cm =
            (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo netInfo = cm.getActiveNetworkInfo();
        if (netInfo != null && netInfo.isConnectedOrConnecting()) {
            return true;
        }
        return false;
    }
Run Code Online (Sandbox Code Playgroud)