我编写了这个小应用程序,它从网络服务中获取一些数据并将它们放入自定义 ListView 中:
SOAP 调用
public String getVoy(String voy) {
String SOAP_ACTION = "XXXXXXXXXX";
String METHOD_NAME = "XXXXXXXXXX";
String NAMESPACE = "urn:DefaultNamespace";
String URL = "http://xxxxxxxxxxxx/xxxxx.nsf/xxxxxxx?wsdl";
SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
request.addProperty("VOY", voy);
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.setOutputSoapObject(request);
HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
try {
androidHttpTransport.call(SOAP_ACTION, envelope);
final SoapObject result = (SoapObject) envelope.bodyIn;
rt = (result != null) ? result.getProperty(0).toString() : "Nessuna risposta 1";
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (XmlPullParserException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} // Invio il webservice
return rt;
}
异步任务
private class LineCall extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... params) {
final String text = WebService.getInstance().getVoy(params[0]);
return text;
}
}
调用AsyncTask并获取数据
LineCall line = new LineCall();
line.execute(voy);
try {
**string** = line.get();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
然后我使用 string 变量,拆分我的数据并将它们放入自定义列表中......
它工作得很好,但问题是很慢所以我尝试创建一个 ProgressDialog 但有一些问题......
如果我把它放在之前的 Activity 中:
Button partenze = (Button) findViewById(R.id.partenze);
partenze.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
StartDeapartures call = new StartDeapartures();
call.execute();
}
});
}
private class StartDeapartures extends AsyncTask<Void, Void, Void> {
private ProgressDialog dialog;
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();
dialog = new ProgressDialog(Home.this);
dialog.setTitle("Loading..");
dialog.setCancelable(false);
dialog.show();
}
@Override
protected Void doInBackground(Void... params) {
Intent intent = new Intent(getApplicationContext(), Partenze.class);
startActivity(intent);
return null;
}
@Override
protected void onPostExecute(Void result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
dialog.dismiss();
}
}
进度图像没有移动,它似乎卡住了,如果我把它放在 LineCall asyncTask 中,则不会显示 ProgressDialog...
我在谷歌中发现这是由于 string = line.get();这需要很长时间才能运行...
那么我如何在 get() 工作时放置 ProgressDialog 呢?
最佳答案
如果调用 AsyncTask.get()
,它将阻塞主线程,直到 doInBackground
完成。因此,您不应调用 AsyncTask.get()
,而应在 AsyncTask.onPostExecute()
方法中处理结果并执行 UI 操作。这是 AsyncTask
的设计行为。
在您的 StartDeapartures 异步任务中,为什么要在 doInBackground 中启动一个 Activity ?使用 AsyncTask 启动 Activity 有什么意义?
关于android - 调用 AsyncTask.get() 时的 ProgressBar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19757341/