2016-07-15 13 views
2

Ich habe einige Daten, die von einer Android App über http (s) an einen Server gesendet werden. Es muss in der Reihenfolge gesendet werden.Wiederholen Sie HTTP (S) POSTs, bis sie auf Android erfolgreich sind

Gibt es bereits eine Möglichkeit, HTTP-Anfragen (für denselben Server) in die Warteschlange zu stellen und sie erneut zu versuchen, bis sie abgeschlossen sind (nicht unbedingt erfolgreich)?

Mein Problem ist, dass HTTP-Anfragen fehlschlagen können, wenn es keine Netzabdeckung gibt. Es sollte eine Art von exponentiellem Back-Off geben oder ein Listener (für eine erneute Verbindung des Netzwerks), um eine Wiederholung des Kopfs der Warteschlange zu veranlassen.

Ich kann das selbst schreiben, aber ich möchte überprüfen, dass ich das Rad nicht neu erfinde.

+2

Verwenden Volley-Bibliothek. Es hat die beste Wiederholungsrichtlinie. –

+2

Eine andere Möglichkeit ist ** Retrofit **. –

+1

Kann der Upload im Hintergrund stattfinden? Wenn ja, können Sie etwas wie Volley oder Retrofit verwenden, um die Daten tatsächlich in Kombination mit einem 'android.net.conn.CONNECTIVITY_CHANGE'-Empfänger hochzuladen, der in der Warteschlange befindliche Daten hochlädt, wenn das Netzwerk zurückkehrt. Ich habe einen ähnlichen Mechanismus in meiner App und es funktioniert hervorragend. – Neil

Antwort

1

Es gibt mehrere Möglichkeiten, es zu tun:

Volley:

RequestQueue queue = Volley.newRequestQueue(ctx); // ctx is the context 
StringRequest req = new StringRequest(Request.Method.GET, url, 
    new Response.Listener<String>() { 
     @Override 
     public void onResponse(String data) { 
      // We handle the response       
     } 
    }, 
    new Response.ErrorListener() { 
     @Override 
      // handle response 
     } 
    ); 
queue.add(req); 

OkHttp:

OkHttpClient client = new OkHttpClient(); 
client.newCall(request).enqueue(new Callback() { 
    @Override 
    public void onFailure(Request request, IOException e) { 
     // Handle error 
    } 

    @Override 
     public void onResponse(Response response) throws IOException { 
     //handle response 
    } 
}); 

Oder Sie einen Zähler in Ihre Anfragen verwenden können und lassen Sie die Server bestellen sie. Wenn Sie interessiert sind, weitere Details über Android-Http-Bibliotheken zu haben, schrieb ich einen Post recentely. Schau mal here

+0

Danke Ich wusste nicht OkHttp. Volley war etwas, das ich in Erwägung zog, um eine HTTP-Post-Retry-Warteschlange zu erstellen. – fadedbee

+0

Die Warteschlange sollte den Fehler/Fehler behandeln, indem sie einfach (für immer oder für 24 Stunden) mit Back-Off versucht. – fadedbee

0

Ich benutze diese Methode für post https Ich bin erfolgreich für alle Bedingungen.

private class AysncTask extends AsyncTask<Void,Void,Void> 
    { 
     private ProgressDialog regDialog=null; 
     @Override 
     protected void onPreExecute() 
     { 
      super.onPreExecute(); 
      regDialog=new ProgressDialog(this); 
      regDialog.setTitle(getResources().getString(R.string.app_name)); 
      regDialog.setMessage(getResources().getString(R.string.app_pleasewait)); 
      regDialog.setIndeterminate(true); 
      regDialog.setCancelable(true); 
      regDialog.show(); 
     }  
     @Override 
     protected Void doInBackground(Void... params) { 
      try 
      { 
       new Thread(new Runnable() { 
        @Override 
        public void run() { 
         ArrayList<NameValuePair> postParameters = new ArrayList<NameValuePair>(); 



         postParameters.add(new BasicNameValuePair("param1", 
           paramvalue)); 
        postParameters.add(new BasicNameValuePair("param2", 
           paramvalue)); 




         String response = null; 
         try { 
          response = SimpleHttpClient 
            .executeHttpPost("url.php", 
              postParameters); 
          res = response.toString(); 

          return res; 

         } catch (Exception e) { 
          e.printStackTrace(); 
          errorMsg = e.getMessage(); 
         } 
        } 
       }).start(); 
       try { 
        Thread.sleep(3000); 


       // error.setText(resp); 
        if (null != errorMsg && !errorMsg.isEmpty()) { 

        } 
       } catch (Exception e) { 
       } 

      } 
      catch (Exception e) 
      { 
       e.printStackTrace(); 
      } 
      return null; 
     } 

     @Override 
     protected void onPostExecute(Void result) 
     { 
      super.onPostExecute(result); 
      if(regDialog!=null) 
      { 

       regDialog.dismiss(); 

      //do you code here you want 

       } 

    // do what u do 
    } 

SimpleHttpClient.java

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.net.URI; 
import java.util.ArrayList; 

import org.apache.http.HttpResponse; 
import org.apache.http.NameValuePair; 
import org.apache.http.client.HttpClient; 
import org.apache.http.client.entity.UrlEncodedFormEntity; 
import org.apache.http.client.methods.HttpGet; 
import org.apache.http.client.methods.HttpPost; 
import org.apache.http.conn.params.ConnManagerParams; 
import org.apache.http.impl.client.DefaultHttpClient; 
import org.apache.http.params.HttpConnectionParams; 
import org.apache.http.params.HttpParams; 

public class SimpleHttpClient { 
/** The time it takes for our client to timeout */ 
    public static final int HTTP_TIMEOUT = 30 * 1000; // milliseconds 

    /** Single instance of our HttpClient */ 
    private static HttpClient mHttpClient; 

    /** 
    * Get our single instance of our HttpClient object. 
    * 
    * @return an HttpClient object with connection parameters set 
    */ 
    private static HttpClient getHttpClient() { 
    if (mHttpClient == null) { 
     mHttpClient = new DefaultHttpClient(); 
     final HttpParams params = mHttpClient.getParams(); 
     HttpConnectionParams.setConnectionTimeout(params, HTTP_TIMEOUT); 
     HttpConnectionParams.setSoTimeout(params, HTTP_TIMEOUT); 
     ConnManagerParams.setTimeout(params, HTTP_TIMEOUT); 
    } 
    return mHttpClient; 
    } 

    public static String executeHttpPost(String url, ArrayList<NameValuePair> postParameters) throws Exception { 
    BufferedReader in = null; 
    try { 
     HttpClient client = getHttpClient(); 
     HttpPost request = new HttpPost(url); 
     UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(postParameters); 
     request.setEntity(formEntity); 
     HttpResponse response = client.execute(request); 
     in = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); 

     StringBuffer sb = new StringBuffer(""); 
     String line = ""; 
     String NL = System.getProperty("line.separator"); 
     while ((line = in.readLine()) != null) { 
     sb.append(line + NL); 
     } 
     in.close(); 

     String result = sb.toString(); 
     return result; 
    } 
    finally { 
     if (in != null) { 
     try { 
      in.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     } 
    } 
    } 


    public static String executeHttpatch(String url, ArrayList<NameValuePair> postParameters) throws Exception { 
    BufferedReader in = null; 
    try { 
     HttpClient client = getHttpClient(); 
     HttpPost request = new HttpPost(url); 
     UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(postParameters); 
     request.setEntity(formEntity); 
     HttpResponse response = client.execute(request); 
     in = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); 

     StringBuffer sb = new StringBuffer(""); 
     String line = ""; 
     String NL = System.getProperty("line.separator"); 
     while ((line = in.readLine()) != null) { 
     sb.append(line + NL); 
     } 
     in.close(); 

     String result = sb.toString(); 
     return result; 
    } 
    finally { 
     if (in != null) { 
     try { 
      in.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     } 
    } 
    } 

    /** 
    * Performs an HTTP GET request to the specified url. 
    * 
    * @param url The web address to post the request to 
    * @return The result of the request 
    * @throws Exception 
    */ 
    public static String executeHttpGet(String url) throws Exception { 
    BufferedReader in = null; 
    try { 
     HttpClient client = getHttpClient(); 
     HttpGet request = new HttpGet(); 
     request.setURI(new URI(url)); 
     HttpResponse response = client.execute(request); 
     in = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); 

     StringBuffer sb = new StringBuffer(""); 
     String line = ""; 
     String NL = System.getProperty("line.separator"); 
     while ((line = in.readLine()) != null) { 
     sb.append(line + NL); 
     } 
     in.close(); 

     String result = sb.toString(); 
     return result; 
    } 
    finally { 
     if (in != null) { 
     try { 
      in.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     } 
    } 
    } 
}