【发布时间】:2011-11-09 07:20:03
【问题描述】:
我有从服务器获取响应的通用异步任务类。我通过使用 get 方法收到这些响应。现在我知道当我使用 get 方法时 UI 线程被阻塞了,因为我的进度对话框没有按时显示。
现在有人可以告诉我这样做的替代方法吗? (在每种情况下,我都需要将响应发送回调用执行的活动,因此打开新活动对我没有帮助)
代码: 异步任务类
public class GetDataFromNetwork extends AsyncTask<Void,String,Object> {
protected void onPreExecute() {
super.onPreExecute();
progressDialog.show();
}
protected Object doInBackground(Void... params) {
Object result = null;
try {
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER10);
new MarshalBase64().register(envelope);
envelope.dotNet = true;
envelope.setOutputSoapObject(request);
AndroidHttpTransport androidHttpTransport = new AndroidHttpTransport(ipAddress + webService);
System.setProperty("http.keepAlive", "true");
try {
androidHttpTransport.call(nameSpace + methodName, envelope);
} catch (Exception e) {
e.printStackTrace();
publishProgress(e.getMessage());
}
androidHttpTransport.debug = true;
System.out.println("response: " + androidHttpTransport.requestDump);
result = envelope.getResponse();
if(result!=null){
System.out.println("GetDataFromNetwork.doInBackground() result expection---------"+result);
}
} catch (Exception e) {
System.out.println("GetDataFromNetwork.doInBackground()-------- Errors");
e.printStackTrace();
}
return result;
}
protected void onPostExecute(Object result) {
super.onPostExecute(result);
progressDialog.dismiss();
}
代码:活动
GetDataFromNetwork request = new GetDataFromNetwork(
this,
ProgressDialog.STYLE_SPINNER,
getResources().getText(R.string.autenticate).toString());
response= (SoapObject)request.execute().get();
【问题讨论】:
-
最简单的解决方案是不要使用 AsyncTask.get() 并在 AsyncTask 实现中处理您的 SoapObject 响应(在 doInBackground() 或 onPostExecute() 中)
-
@yorkw:谢谢,但您的解决方案是不可能的。例如:我的回复返回了一个列表,在一个案例中我需要 setAdapter(),并在另一个案例中向我发送一个类对象。所以通用处理器是不可能的:( .
标签: android android-asynctask progressdialog