2015-12-31 1 views
2

J'ai un asynctask pour vérifier l'accès à internet, mais parfois il ne fonctionne pas, donc j'apprécierais si je m'explique ce comportement bizarre.pourquoi une asynctask est exécutée une fois même si, je ferme l'application?

ceci est mon code:

if(activeNetworkinfo.getType()==ConnectivityManager.TYPE_WIFI){ 
         if(NetworkPrivider()){ 

         //this is my asyntask with weird behavior,and always enter here. 

          CheckInternetAccess ch=new CheckInternetAccess(); 
          ch.execute(); 
          Log.i("sms", "Esta conetado a wifi"); 
         }else{ 
          mycallback.QuePaso(MainActivity.LOCALIZACION_APAGADA_WIFI); 
         } 

        }if(activeNetworkinfo.getType()==ConnectivityManager.TYPE_MOBILE){ 
        Log.i("sms", "Esta conetado a datos"); 
         if(GpsON()){ 
          CheckInternetAccess ch=new CheckInternetAccess(); 
          ch.execute(); 
         }else{ 
          mycallback.QuePaso(MainActivity.LOCALIZACION_APAGADA_GPS); 
         } 

        } 

et ceci est mon asyntask:

 public class CheckInternetAccess extends AsyncTask<Void, Void, Boolean> { 

     //http://clients3.google.com/generate_204 
     @Override 
     protected Boolean doInBackground(Void... params) { 
      Log.i("sms", "Checando acceso a internet..."); 
      try { 
       HttpURLConnection urlc = (HttpURLConnection) 
         (new URL("http://clients3.google.com/generate_204") 
           .openConnection()); 
       urlc.setRequestProperty("User-Agent", "Android"); 
       urlc.setRequestProperty("Connection", "close"); 
       urlc.setConnectTimeout(1000); 
       urlc.connect(); 
       return (urlc.getResponseCode() == 204 && urlc.getContentLength() == 0); 
      }catch (SocketTimeoutException ex){ 
       Log.e("ChecarInternet: ", "Error esperando", ex); 

       cancel(true); 
      }catch (ConnectException e) { 
       Log.e("ChecarInternet: ", "Sin acceso a internet", e); 
       cancel(true); 
      } catch (Exception e) { 
       Log.e("ChecarInternet: ", "Error checking internet connection", e); 
       cancel(true); 
      } 
      return false; 
     } 
@Override 
    protected void onPostExecute(Boolean result) { 

if(result){ 
//do someting. 
} 
} 
} 

quand j'installe aplication le asyntask est exécuté, mais si je ferme la aplication et je rouvrez pas déjà exécuter l'asynctask jusqu'à ce que, je supprime les données de l'application ou installe à nouveau. parfois il est exécuté normalement.

+0

Est-ce dans votre méthode onCreate? quand vous dites close, voulez-vous dire que vous tuez l'application ou est-ce juste hors de l'écran? vous voudrez peut-être l'appeler dans onResume(). –

+0

dans la méthode oncreate appelle une classe et cette classe a l'asyntask et une interface que j'implémente dans activitymain, donc quand asyntask result est vrai, exécute un calback vers ma mainactivity dans la ligne "// do someting". et quand je ferme l'aplication je veux détruire complètement. et je suis désolé pour mon anglais mais je suis du Mexique .. –

Répondre

0

Utilisez cette technique,

class MyActivity { 
    CheckInternetAccess ch; 

    void someMethod() { 
     ch = new CheckInternetAccess(); 
     ch.execute(); 
    } 

    void onPause() { // Activitys onPause 
     if (ch != null) { 
      ch.cancel(true); 
     } 
    } 
} 
+0

mais mon asynctask il n'est pas en activité, mon asynctask c'est sur la classe simple, pensez-vous que cela fonctionne aussi? –

+0

oui. Puis trouvez quelle application utilise cette asynctask. et annuler si nécessaire. –

+0

Alors, quelle est la différence entre ch.cancel(); et annuler (vrai); , parce que j'annule quand il s'est produit une erreur d'exception –