0

我有一个 Web 服务类来调用我的 Web 方法。但这必须在 AsyncTask 类中调用。目前,我的所有活动中都有一个 AsyncTask 类来调用我的 Web 服务方法。是否可以将它们混合在一起(Web 服务类和 AsyncTask)以拥有一个 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);
        }
    }
}
4

2 回答 2

0

我建议为每个 webservice 方法添加(静态?)方法到您的 WebService 类,并从调用 Activity 传入一个侦听器,然后在 onPostExecute 中调用该侦听器。

然后,您可以从 Activity 调用 WebService.doThings(thingsListener),使用相应的方法执行 AsyncTask 并在提供的侦听器中对结果做出反应......

于 2013-10-30T09:38:22.253 回答
0

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

  1. 将所有 api 调用实现为static方法。它们以同步方式被调用
  2. 一个IntentService后裔,他调用 api 然后
  3. IntentService将结果作为意图广播。感兴趣的活动从这里订阅事件IntentService

要使活动独立于网络操作,请考虑使用 db、aContentProvider或其他一些存储机制,这样可能会利用LoaderManageretc 的所有好处。这种方法会花费您一些时间,但架构会从中受益匪浅。

于 2013-10-30T10:05:27.997 回答