Android 如何以异步方式调用web服务类?
我有一个web服务类来调用我的web方法。但这必须在AsyncTask类中调用。目前,我在所有活动中都有一个AsyncTask类来调用我的web服务方法。是否可以混合使用它们(Web服务类和AsyncTask)来创建一个Web服务类,该类采用Web方法的名称,并在执行后返回结果 这是我的web服务类:Android 如何以异步方式调用web服务类?,android,web-services,android-asynctask,Android,Web Services,Android Asynctask,我有一个web服务类来调用我的web方法。但这必须在AsyncTask类中调用。目前,我在所有活动中都有一个AsyncTask类来调用我的web服务方法。是否可以混合使用它们(Web服务类和AsyncTask)来创建一个Web服务类,该类采用Web方法的名称,并在执行后返回结果 这是我的web服务类: package ClassLibrary; public class WebService { private String namespace=""; private Stri
package ClassLibrary;
public class WebService {
private String namespace="";
private String url="";
public WebService(String namespace,String url) {
super();
this.namespace = namespace;
this.url = url;
}
public String CallMethod(String methodName,PropertyInfo pi) {
String result = "default";
SoapObject request = new SoapObject(namespace, methodName);
request.addProperty(pi);
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.dotNet = true;
envelope.setOutputSoapObject(request);
HttpTransportSE androidHttpTransport = new HttpTransportSE(url);
try {
androidHttpTransport.call(namespace+methodName, envelope);
SoapPrimitive response = (SoapPrimitive) envelope.getResponse();
result= response.toString();
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
}
这是我在AsyncTask中访问的方式:
private class AsyncCallWS extends AsyncTask<String, Void, Void> {
private ProgressDialog dialog;
private Activity activity;
public String wsOutput="";
public String methodName="";
private WebService ws;
public AsyncCallWS(Activity activity,String methodName) {
this.activity = activity;
this.dialog = new ProgressDialog(activity);
this.methodName = methodName;
}
@Override
protected Void doInBackground(String... params) {
ws = new WebService(PublicVariable.NAMESPACE, PublicVariable.URL);
PropertyInfo pi= new PropertyInfo();
pi.setName("UserID");
pi.setValue("1");
pi.setType(String.class);
wsOutput=ws.CallMethod("GetPersonalInfo", pi);
return null;
}
@Override
protected void onPostExecute(Void result) {
if (this.dialog.isShowing()) {
this.dialog.dismiss();
}
if (methodName == "GetPersonalInfo") {
Log.d("Ehsan","OUTPUT IS:"+ wsOutput);
}
}
}
私有类AsyncCallWS扩展了AsyncTask{
私人对话;
私人活动;
公共字符串wsOutput=“”;
公共字符串methodName=“”;
私有web服务;
公共异步调用(活动,字符串方法名){
这个。活动=活动;
this.dialog=新建进度对话框(活动);
this.methodName=methodName;
}
@凌驾
受保护的Void doInBackground(字符串…参数){
ws=新的Web服务(PublicVariable.NAMESPACE,PublicVariable.URL);
PropertyInfo pi=新的PropertyInfo();
pi.setName(“UserID”);
pi.设定值(“1”);
pi.setType(String.class);
wsOutput=ws.CallMethod(“GetPersonalInfo”,pi);
返回null;
}
@凌驾
受保护的void onPostExecute(void结果){
if(this.dialog.isShowing()){
this.dialog.disclose();
}
如果(methodName==“GetPersonalInfo”){
Log.d(“Ehsan”,“输出为:”+wsOutput);
}
}
}
我建议为每个WebService方法向WebService类添加(静态?)方法,并从调用活动传入一个侦听器,然后在onPostExecute中调用该侦听器
然后,您可以从活动中调用WebService.doThings(thingsListener),使用相应的方法执行AsyncTask,并在提供的侦听器中对结果作出反应…当我遇到同样的问题时,我做到了:
静态方法。它们以同步方式由
IntentService
后代,调用api然后IntentService
将结果作为意图进行广播。感兴趣的活动订阅此IntentService
< >为了使活动独立于网络操作,考虑使用DB、<代码>内容提供者< /代码>或其他一些存储机制,从而可以获得<>代码> LoaderManager < /代码>的所有好处。但是,AsyncQueryHandler classin在这种情况下,最好是将内容提供者和AsyncQueryHandler结合起来,这样不仅查询将被执行,而且可以更新,delete和insert您可以通过实现匿名接口来获取此信息,该接口将在doInbackground中返回结果。