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工作正常,没有例外。我想用当前状态更新文本视图,但为什么不调用所有步骤?

谢谢

4

2 回答 2

2

两个问题:

  1. onPostExcute接受与返回值类型相同的参数doInBackground,因此您拥有的版本不是相同的方法签名(您实际上并没有覆盖该方法)并且不会被调用。它应该是onPostExecute(Void result)
  2. onProgressUpdatepublishProgress仅在您从后台方法调用时才被调用。如果您不调用发布,则不会触发任何更新。

请注意,如果您养成使用@Override属性的习惯,编译器会发现 #1 之类的问题。

高温高压

于 2012-06-18T21:48:39.553 回答
0

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

AsyncTask<Void, Integer, Void>

但是这三种方法都是Voids。尝试更改IntegerVoid,即

AsyncTask<Void, Void, Void>

原答案:

AnAsyncTask在与主 UI 线程不同的线程上运行,主 UI 线程控制 UI(以及您的 TextView)。您需要在主 UI 线程上更新 TextView。这样做的一种方法是将消息发送回主线程并实现消息处理程序,然后更新 TextView。

于 2012-06-18T21:31:34.393 回答