Android 如何以异步方式调用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

我有一个web服务类来调用我的web方法。但这必须在AsyncTask类中调用。目前,我在所有活动中都有一个AsyncTask类来调用我的web服务方法。是否可以混合使用它们(Web服务类和AsyncTask)来创建一个Web服务类,该类采用Web方法的名称,并在执行后返回结果

这是我的web服务类:

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,并在提供的侦听器中对结果作出反应…

当我遇到同样的问题时,我做到了:

  • 将所有api调用实现为
    静态方法。它们以同步方式由
  • 一个
    IntentService
    后代,调用api然后
  • IntentService
    将结果作为意图进行广播。感兴趣的活动订阅此
    IntentService

  • < >为了使活动独立于网络操作,考虑使用DB、<代码>内容提供者< /代码>或其他一些存储机制,从而可以获得<>代码> LoaderManager < /代码>的所有好处。但是,AsyncQueryHandler classin在这种情况下,最好是将内容提供者和AsyncQueryHandler结合起来,这样不仅查询将被执行,而且可以更新,delete和insert您可以通过实现匿名接口来获取此信息,该接口将在doInbackground中返回结果。