#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. А.Кирога, ты все еще там?