Асинхронная задача с HttpClient и Progressbar

#android #progress-bar #httpclient #android-asynctask

#Android #индикатор выполнения #httpclient #android-асинхронная задача

Вопрос:

Я пытаюсь заставить свой HttpClient работать с Asynctask, включая progressbar. У меня уже есть этот код Asynctask:

 private class httpClient extends AsyncTask<String, Boolean, String> {

private HttpClient httpClient = getHttpClient();

@Override
protected String doInBackground(String... params) {
    publishProgress(true); 
    // Do the usual httpclient thing to get the result
    return null;
} 

@Override 
protected void onProgressUpdate(Boolean... progress) { 
    // line below coupled with  
    //    getWindow().requestFeature(Window.FEATURE_INDETERMINATE_PROGRESS)  
    //    before setContentView  
    // will show the wait animation on the top-right corner 
    AndroidLogin.this.setProgressBarIndeterminateVisibility(progress[0]); 
} 

@Override 
protected void onPostExecute(String result) { 
    publishProgress(false); 
    // Do something with result in your activity 
} 

}
  

Мой вопрос в том, как правильно поместить приведенный ниже код в Asynctask, и чтобы панель выполнения также работала.
Может кто-нибудь, пожалуйста, помочь?

 /******* INPUT USERNAME AND PASSWORD *******/
        EditText uname = (EditText)findViewById(R.id.txt_username); // user input through EditText
        String username = uname.getText().toString();
        EditText pword = (EditText)findViewById(R.id.txt_password); // password input through EditText
        String password = pword.getText().toString();

/******* INSTANTIATE THE CUSTOM HTTPCLIENT *******/
        HttpClient httpClient = getHttpClient();
        HttpPost request = new HttpPost("https://xxx"); 

        List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); 
        nameValuePairs.add(new BasicNameValuePair("usr_name", username)); 
        nameValuePairs.add(new BasicNameValuePair("usr_password", password)); 
        request.setEntity(new UrlEncodedFormEntity(nameValuePairs));

/******* EXECUTE HTTPCLIENT *******/
        try  
        { 
        HttpResponse response = httpClient.execute(request); 

/******* READ CONTENT IN BUFFER *******/
        InputStream inputStreamActivity = response.getEntity().getContent();  
        BufferedReader reader = new BufferedReader(new InputStreamReader(inputStreamActivity));
        StringBuilder sb = new StringBuilder();
        String line = null;

        while ((line = reader.readLine()) != null) {
        sb.append(line   "n");
        }
/******* CLOSE CONNECTION AND STREAM *******/
        System.out.println(sb);
            inputStreamActivity.close();
        httpClient.getConnectionManager().shutdown();
  

Ответ №1:

Я нашел решение. Мне нужно было включить текстовые поля в Asynctask, чтобы избежать исключения.

 EditText uname = (EditText)findViewById(R.id.txt_username);
EditText pword = (EditText)findViewById(R.id.txt_password);
  

Я решил использовать ProgressDialog вместо Progressbar, необходимо добавить следующее:

 //Create a Progressdialog
ProgressDialog pd = new ProgressDialog(MyApp.this);

@Override 
    protected void onPreExecute()  
    { 
        //Set the Progressdialog
        pd.setProgressStyle(ProgressDialog.STYLE_SPINNER); 
        pd.setMessage("Getting data....");
                 }

 @Override
    protected void onProgressUpdate(Integer... args) { 
           //Update the Progressdialog
           pd.setProgress(args[0]); 
           } 

  @Override 
    protected void onPostExecute(String result) { 
        //Dismiss Progressdialog
        pd.dismiss();
                 }
  

Вот и все..

Ответ №2:

Попробуйте использовать onPreExecute для инициализации ProgressBar и, среди прочего, для других вещей, которые не касаются ваших важных вещей:

 @Override
protected void onPreExecute() 
{
     publishProgress(true); 
}

@Override
protected String doInBackground(String... params)
{
     funtiontoallthatbigcodeorcodeitselfhere(); 
}

...
  

Комментарии:

1. Привет, А.Кирога, я получаю принудительное закрытие, похоже, не работает.

2. 10-16 13:32:52.735: WARN/dalvikvm(8257): threadid= 1: поток завершается с неперехваченным исключением (group = 0x401ba560)

3. Мне также пришлось попробовать обойти: nameValuePairs.add(новая базовая пара значений («usr_password», пароль));

4. Вот ошибка из Logcat: ОШИБКА/AndroidRuntime(8675): java.lang.RuntimeException: не удалось создать экземпляр activity ComponentInfo{com.sencide/com.sencide . AndroidLogin}: java.lang. Исключение NullPointerException

5. А.Кирога, ты все еще там?