HTTPRetryHandler в Asynctask - PullRequest
       14

HTTPRetryHandler в Asynctask

0 голосов
/ 28 января 2012

Прежде всего, извините, если код выглядит грязным, я попытался сделать отступ, но, похоже, мне нужно больше практики.

Я выполняю 3 HTTPS-запроса в AsyncTask (doInBackground).

Каждый запрос захватывает данные сома с веб-сайта.

Я пытаюсь создать HTTPRetryHandler, который повторяет каждый запрос 3 раза.Я уже нашел хороший пример , но я не знаю, как применить это к моему коду.

Любая помощь с очень ценится, спасибо.

Я используюодин и тот же HTTPClient для каждого запроса:

public HttpClient getHttpClient() { 

 DefaultHttpClient client = null;

  ResponseCache.setDefault(null);

try {  





KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType()); 
            trustStore.load(null, null); 
            SSLSocketFactory sf = new MySSLSocketFactory(trustStore); 
            sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); 

            // Setting up parameters 
            HttpParams params = new BasicHttpParams(); 
            params.setParameter(ConnManagerPNames.MAX_TOTAL_CONNECTIONS, 30); // default 30
            params.setParameter(ConnManagerPNames.MAX_CONNECTIONS_PER_ROUTE, new ConnPerRouteBean(30)); // default 30
            //params.setParameter(HttpProtocolParams.USE_EXPECT_CONTINUE, false); 
            HttpProtocolParams.setUseExpectContinue(params, false);
            HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1); 
            HttpProtocolParams.setContentCharset(params, "UTF-8"); 

            // Setting timeout 
            HttpConnectionParams.setConnectionTimeout(params, 30000); 
            HttpConnectionParams.setSoTimeout(params, 30000); 

            // Registering schemes for both HTTP and HTTPS 
            SchemeRegistry registry = new SchemeRegistry(); 
            registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); 
            registry.register(new Scheme("https", sf, 443)); 

            // Creating thread safe client connection manager 
            ClientConnectionManager ccm = new ThreadSafeClientConnManager(params, registry); 

            // Creating HTTP client 
            client  = new DefaultHttpClient(ccm, params); 

        } catch (Exception e) { 
            client = new DefaultHttpClient(); 
            Toast.makeText(AndroidLogin.this, "Problem with connection!", Toast.LENGTH_LONG).show(); 
        } 

        return client; 
    }

Пример вызова в doInBackground:

/******* 2nd HTTP Request *******/
                try
                {
                    HttpPost request1 = new HttpPost("some webpage");
                    HttpResponse response1 = httpClient.execute(request1); 

                    InputStream inputStreamActivity1 = response1.getEntity().getContent();  
                    BufferedReader reader1 = new BufferedReader(new InputStreamReader(inputStreamActivity1));
                    StringBuilder sb1 = new StringBuilder();
                    String line1 = null;
                    String lookUp1 = "</response>";

                    while ((line1 = reader1.readLine()) != null) 
                    {
                        sb1.append(line1);
                        if (line1.indexOf(lookUp1)!= -1)
                        {
                            System.out.println("Found: </response>");
                            HttpRequest2 = "success";
                        }
                    }
                    STRINGBUILD_REQUEST2 = sb1.toString();
                    inputStreamActivity1.close();
                    publishProgress(response1.toString().length());

                } catch(SocketTimeoutException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                    Log.e("TAG: ", "SocketTimeoutException occured during HTTP request 2!");
                }
                /************* END 2nd HTTP Request *****************/

1 Ответ

0 голосов
/ 28 января 2012

Я смог решить эту проблему самостоятельно, поместив следующий код в мой HTTPClient.

Поскольку setUseExpectContinue, похоже, не решает проблему.

HttpRequestRetryHandler retryHandler = new HttpRequestRetryHandler() {

            @Override
            public boolean retryRequest(IOException exception, int executionCount, HttpContext context) {
                // TODO Auto-generated method stub
                if(executionCount >= 10) { // Retry 10 times        
                    return false;                 
                    } 
                if(exception instanceof SocketTimeoutException)
                {                     
                    return true;                 
                    } 
                else if (exception instanceof ClientProtocolException)
                {                     
                    return true;                 
                    }  
                return false;             
                }  
            };   

        client.setHttpRequestRetryHandler(retryHandler);
...