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,但为什么不调用所有步骤?
由于
答案 0 :(得分:2)
两个问题:
onPostExcute
采用与doInBackground
的返回值类型相同的参数,因此您拥有的版本不是相同的方法签名(您实际上没有覆盖该方法)和不会被打电话。它应该是onPostExecute(Void result)
onProgressUpdate
时才会调用publishProgress
。如果您不调用发布,则不会触发更新。请注意,如果您养成使用@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。