Способ установки времени ожидания соединения в методе асинхронной публикации

Я использую метод асинхронной отправки для отправки некоторых данных на сервер. Сообщение работает нормально, но если сервер не работает или не отвечает, я получаю принудительное закрытие в приложении.

Как реализовать тайм-аут для запроса на публикацию?

Это класс, который асинхронно отправляет сообщения по определенному URL-адресу:

    //===================================================================================================================================
//sending EmailAddress and Password to server
//===================================================================================================================================
private class MyAsyncTask extends AsyncTask<String, Integer, Double>{


    @Override
    protected Double doInBackground(String... params) {
        // TODO Auto-generated method stub
        postData(params[0],params[1]);
        return null;
    }

    protected void onPostExecute(Double result){


        if(responseBody.contains("TRUE"))
        {
            String raw=responseBody;
            raw = raw.substring(0, raw.lastIndexOf("<"));
            raw = raw.substring(raw.lastIndexOf(">") + 1, raw.length());
            String [] contents = raw.split(",");
            //extracting user name and user id from response
            String user_name=contents[1];
            String student_code=contents[2];
            //save user name and user id in preference
            saveInPreference("user_name",user_name);
            saveInPreference("student_code",student_code);

            //login is successful, going to next activity       
            Intent intent = new Intent(LoginActivity.this, TakeTestActivity.class);
            //hiding progress bar
            progress.dismiss();
            finish();
            LoginActivity.this.startActivity(intent);

        }

        else
        {
            //hiding progress bar
            progress.dismiss();
            create_alert("Attention!", "Please provide valid userid and password");
        }
    }

    protected void onProgressUpdate(Integer... progress){

    }

    public void postData(String emailId,String passwrd) {

**//EDIT START**
HttpParams httpParams = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(httpParams, 10000);

HttpConnectionParams.setSoTimeout(httpParams, 10000);

HttpClient httpclient = new DefaultHttpClient(httpParams); 
**//EDIT END** 

        // Create a new HttpClient and Post Header
        //HttpClient httpclient = new DefaultHttpClient();

        SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(LoginActivity.this);
        final String url_first = preferences.getString("URLFirstPart","");
        HttpPost httppost = new HttpPost(url_first+"ValidateLogin");

        try {
            // Data that I am sending
            List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
            nameValuePairs.add(new BasicNameValuePair("EmailId", emailId));
            nameValuePairs.add(new BasicNameValuePair("Password", passwrd));
            httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

                    **//EDIT START**
                    try 
                    {
            // Execute HTTP Post Request
            httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
            HttpResponse response = httpclient.execute(httppost);
            responseBody = EntityUtils.toString(response.getEntity());
                   } 
                   catch (SocketTimeoutException ex)
                   {
                        // Do something specific for SocketTimeoutException.
                   }
                   **//EDIT END**

            //Log.d("result", responseBody);
        } 
        catch (Throwable t ) {

        } 
    }
}
                //===================================================================================================================================
                //END sending EmailAddress and Password to server 
                //===================================================================================================================================

Вот как я вызываю класс для выполнения почтового запроса:

//sending request for login

new MyAsyncTask().execute(txtUsername.getText().toString(),txtPassword.getText().toString());

Что мне следует сделать, чтобы реализовать тайм-аут соединения через определенное время, если сервер не отвечает или недоступен?

Отредактировано:

Как уведомить пользователя с помощью оповещения о том, что время ожидания подключения истекло? Где я должен поместить оповещение и при каком условии?

Заранее спасибо!


person kittu88    schedule 20.03.2013    source источник


Ответы (1)


Вы можете попробовать это, я установил 10 сек. здесь...

HttpParams httpParams = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(httpParams, 10000);

HttpConnectionParams.setSoTimeout(httpParams, 10000);

HttpClient client = new DefaultHttpClient(httpParams);  
person Mohit Mehta    schedule 20.03.2013
comment
@kittu88 Как вы справляетесь с ответом? Я имею в виду, вы создали обработчик для этого? - person Mohit Mehta; 20.03.2013
comment
да, вы можете проверить класс выше. Если вы считаете, что требуются какие-либо изменения, вы можете предложить мне, что - person kittu88; 20.03.2013
comment
@kittu88, вы можете поймать перехват исключения (SocketTimeoutException ex) { // Сделать что-то конкретное для SocketTimeoutException. } - person Mohit Mehta; 20.03.2013
comment
Если вы не возражаете, не могли бы вы предложить правку внутри моего кода? - person kittu88; 20.03.2013
comment
@kittu88 kittu88, пожалуйста, проверьте сейчас... хотя я его не компилировал - person Mohit Mehta; 20.03.2013