2017-08-16 7 views
1

J'ai un problème que je n'ai pas encore résolu et j'ai besoin d'aide.Comment gérer le délai de connexion en tâche asynchrone

Lorsque l'Internet est lent, l'application plante. comment puis-je vérifier le délai de connexion dans asyntask.

J'ai fait une application qui se connectent parfois au service Web pour obtenir des données et je le fais en utilisant la tâche async

Je veux faire de dialogue d'alerte sur le délai de connexion lorsque l'utilisateur peut choisir s'ils veulent recommencer ou annuler, si ils choisissent nouvelle tentative, il essaiera de se connecter à nouveau

public class login extends AsyncTask<Void,Void,Void> { 

    InputStream ins; 
    String status, result, s = null, data = "",js; 
    int ss; 
    int responseCode; 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     pdlg.setTitle("Checking"); 
     pdlg.setMessage("Please wait"); 
     pdlg.setCancelable(false); 
     pdlg.show(); 
    } 

    @Override 
    protected Void doInBackground(Void... params) { 
     StringBuilder sb = new StringBuilder(); 
     ArrayList al; 
     try { 
      URL url = new URL("http://....login.php"); 
      String param = "username=" + uname + "&password=" + pass; 
      HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
      connection.setRequestMethod("POST"); 
      connection.setConnectTimeout(15000); 
      connection.setReadTimeout(15000); 
      connection.setDoInput(true); 
      connection.setDoOutput(true); 

      OutputStream os = connection.getOutputStream(); 
      BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os, "UTF-8")); 
      bw.write(param); 
      bw.flush(); 
      bw.close(); 

      responseCode = connection.getResponseCode(); 
      if (responseCode == HttpURLConnection.HTTP_OK) { 
       BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream())); 
       String line = ""; 
       while ((line = br.readLine()) != null) { 
        sb.append(line + "\n"); 
       } 
      } 
      data = sb.toString(); 
      JSONObject json = new JSONObject(data); 

      status=json.getString("Status");//{"Login Status":"Success","Receipt Details":"No data available"} 

      // js=json.getString("Login");//{"Login":"Failed"} 



     } catch (MalformedURLException e) { 
      Log.i("MalformedURLException", e.getMessage()); 
     } catch (IOException e) { 
      Log.i("IOException", e.getMessage()); 
     } catch (JSONException e) { 
      Log.i("JSONException", e.getMessage()); 
     } 

     return null; 
    } 

    protected void onPostExecute(Void result) { 
     super.onPostExecute(result); 

     String status1=status.trim(); 


     if (status1.equals("Success")) { 
    Toast.makeText(getApplicationContext(), "Login Succes !!", Toast.LENGTH_SHORT).show(); 

      Intent i = new Intent(Login.this, Home.class); 
      startActivity(i); 
      finish(); 
      SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); 
      SharedPreferences.Editor editor = sharedPreferences.edit(); 
      editor.putBoolean("first_time", false); 
      editor.putString("userrname", uname); 
      editor.putString("password",pass); 
      editor.apply(); 
      Toast.makeText(getApplicationContext(),"welcome : "+uname,Toast.LENGTH_LONG).show(); 

     } 

else { 
    Toast t=Toast.makeText(Login.this, "Username or Password is Incorrect", Toast.LENGTH_LONG); 
      t.setGravity(Gravity.BOTTOM,0,0); 
         t.show(); 
} 

     pdlg.dismiss(); 


    } 



    } 

Répondre

1

Vous pouvez utiliser getErrorStream(),

HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
InputStream inp; 

// if some error in connection 
inp = connection.getErrorStream(); 

chèque this réponse pour plus de détails ..

selon le doc retourne

un flux d'erreur le cas échéant, null s'il n'y a pas eu d'erreurs, le connexion n'est pas connecté ou serveur n'a pas envoyé de données utiles

.

1

utiliser ces deux blocs catch pour gérer ConnectionTimeOut et socketTimeOut Exceptions

 catch (SocketTimeoutException bug) { 
      Toast.makeText(getApplicationContext(), "Socket Timeout", Toast.LENGTH_LONG).show(); 
     } 
     catch (ConnectTimeoutException bug) { 
      Toast.makeText(getApplicationContext(), "Connection Timeout", Toast.LENGTH_LONG).show(); 
     } 
+0

veuillez accepter la réponse si c'est utile. –

1

Pour le temps de connexion à ajouter SocketTimeoutException dans votre bloc catch et son plantage parce que sans contrôle nul, vous essayez de couper la chaîne dans onPostExecute

Vous devriez faire comme ça, et vérifier avant d'utiliser le statut

if(TextUtil.isEmpty(status)) { 
    pdlg.dismiss(); 
    // We are getting empty response 
    return; 
} 
String status1=status.trim(); 
1

Ce que vous essayez de faire est déjà fait dans une bonne librairie. Donc, je vous invite à utiliser l'un des widley réseau utilisé widley. Volley. Ou si vous voulez comprendre, vous pouvez simplement vérifier l'état de la réponse (ou le code d'état devrait être 408. Je suppose que pour le délai de connexion) si elle renverra "timeout de connexion" alors vous pouvez appeler votre code au http client à nouveau pour effectuer votre tâche, vous pouvez également ajouter un nombre de tentatives pour essayer 2-3 fois, puis abandonner et envoyer une réponse à la méthode onpostexecute.

Espérons que cela aide.

1

Vous pouvez intercepter l'exception du délai de connexion dans votre code, puis définir l'état en fonction de vos besoins et vérifier ce statut onPostExecute pour afficher l'alerte Dialog

try { 
      URL url = new URL("http://....login.php"); 
      String param = "username=" + uname + "&password=" + pass; 
    // Your URL connection code here 
catch (ConnectTimeoutException e) { 
     Log.e(TAG, "Timeout", e); 
     status="timeout" 
    } catch (SocketTimeoutException e) { 
     Log.e(TAG, " Socket timeout", e); 
     status="timeout" 
    } 

dans onPostExecute

if (status.equals("timeout")) { 
    // Show Alert Dialog. 
}