我想在我的Android应用程序中使用ksoap2 web服务返回一个特定的字符串。
Web服务返回正确的值,但一旦任务完成,设置文本就不会更新。我需要做一些事情(比如试图打开导航抽屉)然后它会更新。任何想法??
我的代码如下
// Calling the async class
protected void onResume() {
try {
super.onResume();
new RetrieveTimeWS().execute();
}
catch (Exception e)
{
Log.e("Current Time", e.getMessage());
}
}
以下是异步任务
class RetrieveTimeWS extends AsyncTask<Void, Void, String> {
protected String doInBackground(Void... params) {
String datetime = "";
try {
TextView TVcurrentTime = (TextView) findViewById(R.id.DateTimeNow);
TVcurrentTime.setText("Loading...");
datetime = getDateTimeClass.getDateTime();
TVcurrentTime.setText(datetime);
} catch (Exception e) {
Log.e("Async Task - GetDateTime ", e.getMessage());
}
return datetime;
}
}
文本字段显示&#34;正在加载...&#34;直到我触摸屏幕上的任何组件。在Web服务返回文本后,如何将textview更改为所需的字符串。
提前致谢。
LAKS。
答案 0 :(得分:3)
您无法与UI交互,也无法与UI线程进行交互。 AsyncTask具有从UI线程调用的onPreExecute和PostExecute方法,您可以在其中更改UI。
class RetrieveTimeWS extends AsyncTask<Void, Void, String> {
TextView TVcurrentTime = (TextView) findViewById(R.id.DateTimeNow);
Exception e;
@Override
protected void onPreExecute() {
super.onPreExecute();
TVcurrentTime.setText("Loading...");
}
protected String doInBackground(Void... params) {
String datetime = "";
try {
datetime = getDateTimeClass.getDateTime();
} catch (Exception e) {
this.e = e;
Log.e("Async Task - GetDateTime ", e.getMessage());
}
return datetime;
}
@Override
protected void onPostExecute(final String s) {
super.onPostExecute(s);
if (e != null) {
TVcurrentTime.setText(s);
}
}
}
答案 1 :(得分:0)
您无法在后台线程中执行任何UI工作。在onPostExecute()方法中执行此操作。 此方法在主线程上运行。因此,您可以在此方法中设置文本。