Android: verifique a rede e a conectividade real à Internet

Abaixo está o código do Android que funciona bem para verificar se a rede está conectada ou não.

public static boolean isNetworkAvailable(Context context) 
{
    ConnectivityManager mConnectivityManager = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
    return (mConnectivityManager != null && mConnectivityManager.getActiveNetworkInfo().isConnectedOrConnecting()) ? true : false;
}

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

Mas ter uma interface de rede ativa não garante que um serviço de rede específico esteja disponível.

Muitas vezes acontece que estamos conectados à rede, mas ainda não alcançáveis a serviços comuns de rede da Internet, por exemplo, Google

Cenário comum:

Dispositivo Android conectado a um Wi-Fi, que acaba sendo uma rede privada. Portanto, isNetworkAvailable retornará que a rede está conectada, mas não pôde ser conectada a nenhum outro serviçoAlgumas vezes o sinal do telefone mostra que está conectado ao plano de dados do provedor de serviços. portanto, a conectividade de rede é verdadeira, mas ainda não pode acessar o Google / Yahoo.

Uma maneira é verificar se a função "isNetworkAvailable" retorna TRUE e execute o seguinte código

HttpGet request = new HttpGet(url));
   HttpParams httpParameters = new BasicHttpParams();
   int timeoutConnection = 60000;
   HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);
   int timeoutSocket = 60000;
   HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);

   DefaultHttpClient httpClient = new DefaultHttpClient(httpParameters);
   request.addHeader("Content-Type", "application/json");
   HttpResponse response = httpClient.execute(request);

   HttpEntity entity = response.getEntity();


     if (entity != null)
      {
         result = EntityUtils.toString(entity);
      }

   }
 catch (SocketException e)
  {
     return "Socket Exceptiopn:" + e.toString();
  }
 catch (Exception e)
  {
     return "General Execption:" + e.toString();
  }

Mas acho que esse não é um bom caminho, pois pode consumir muito tempo

Portanto, existe alguma maneira alternativa eficiente (em termos de tempo gasto, velocidade) para garantir que estamos conectados à rede e também acessíveis aos serviços de Internet mais comuns?