2012-06-18 3 views
0
public class HttpPostTask extends AsyncTask<Void, Integer, Void> { 

    TextView txtStatus = (TextView)findViewById(R.id.txtStatus); 

    @Override 
    protected Void doInBackground(Void... params) { 

     EditText editText1 = (EditText)findViewById(R.id.editText1); 

     try { 

      HttpClient httpclient = new DefaultHttpClient(); 
      HttpPost httppost = new HttpPost("http://83.254.xx.xx/android/service.php"); 

      List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2); 
      nameValuePairs.add(new BasicNameValuePair("action", "savedata")); 
      nameValuePairs.add(new BasicNameValuePair("data", editText1.getText().toString())); 
      httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 

      HttpResponse response = httpclient.execute(httppost); 

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

    protected void onPreExecute(){ 

     Log.i("debug", "onPreExecute"); 
    } 

    protected void onProgressUpdate(Integer... progress) { 

     Log.i("debug", "onProgressUpdate, " + progress[0]); 
    } 

    protected void onPostExecute() { 

     Log.i("debug", "onPostExecute"); 
    } 
} 

Все, что я вижу в журнале, это onPreExecute. Код в doInBackground работает отлично, и нет никаких исключений. Я хотел бы обновить textview с текущим статусом, но почему все вызовы не вызваны?Шаги AsyncTask

Благодаря

ответ

2

Два вопроса:

  1. onPostExcute принимает параметр, который того же типа, что и возвращаемое значение doInBackground, поэтому у вас версия не тот же самый метод подписи (вы на самом деле не переопределить метод) и не будет вызван. Это должно быть onPostExecute(Void result)
  2. onProgressUpdate только вызывается, когда вы вызываете publishProgress из вашего фонового метода. Если вы не вызываете публикацию, обновления не будут срабатывать.

Просто обратите внимание, если вы привыкли использовать атрибут @Override, проблемы, подобные # 1, будут улавливаться компилятором.

HTH

+0

Спасибо за разработку :) – Johan

0

EDIT: Похоже, вопрос был отредактирован ... Я думаю, что это из-типов вы объявили для AsyncTask методов. У вас есть

AsyncTask<Void, Integer, Void> 

, но три метода все Void s. Попробуйте изменить Integer к Void, т.е.

AsyncTask<Void, Void, Void> 

Оригинальный ответ:

An AsyncTask работает на другом потоке, чем ваш основной поток пользовательского интерфейса, который контролирует UI (и, следовательно, ваш TextView). Вам нужно обновить TextView в главном потоке пользовательского интерфейса. Один из способов сделать это - отправить сообщение обратно в основной поток и реализовать обработчик сообщений, чтобы затем обновить TextView.

+0

Установка текста в TextView отлично подходит для этого класса. Вы говорите, что его плохая практика или что она просто не работает? Кажется, это работает для меня. – Johan

+0

Я думаю, что я ответил слишком быстро ... возможно, мое редактирование поможет? –

+0

«Похоже, что вопрос был отредактирован ...» - Единственное, что было отредактировано, - это название :) И если я использую 'AsyncTask ' вместо 'AsyncTask ' , im может использовать целое число и возвращать его в 'onPostExecute' в результате. Если я ничего не пропустил, но, похоже, он работает. – Johan

Смежные вопросы