AsyncTask步骤

时间:2012-06-18 21:11:41

标签: java android android-asynctask

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");
    }
}

我在日志中看到的只是onPreExecutedoInBackground中的代码运行正常,没有例外。我想用当前状态更新textview,但为什么不调用所有步骤?

由于

2 个答案:

答案 0 :(得分:2)

两个问题:

  1. onPostExcute采用与doInBackground的返回值类型相同的参数,因此您拥有的版本不是相同的方法签名(您实际上没有覆盖该方法)和不会被打电话。它应该是onPostExecute(Void result)
  2. 只有从您的后台方法调用onProgressUpdate时才会调用
  3. publishProgress。如果您不调用发布,则不会触发更新。
  4. 请注意,如果您养成使用@Override属性的习惯,编译器会捕获#1等问题。

    HTH

答案 1 :(得分:0)

编辑:看起来问题已被编辑...我认为这是因为您为AsyncTask方法声明的类型。

AsyncTask<Void, Integer, Void>

但这三种方法都是Void s。尝试将Integer更改为Void,即

AsyncTask<Void, Void, Void>

原始答案:

AsyncTask运行在与主UI线程不同的线程上,后者控制UI(因此也就是TextView)。您需要更新主UI线程上的TextView。一种方法是将消息发送回主线程并实现Message处理程序,然后更新TextView。