透彻理解Java回调函数

来源:互联网 发布:淘宝买衣服 如何换货 编辑:程序博客网 时间:2024/06/06 05:09
做了一个安卓访问WebService的项目,其中系统有一个WebService访问类,但是返回数据是在异步方法的回调函数中,要返回给Activity,就需要再做一个Activity回调函数。代码如下:
一、WebService.java
package com.hicano.normal;
import java.io.IOException;
import java.util.Iterator;
import java.util.Map;
import org.ksoap2.SoapEnvelope;
import org.ksoap2.SoapFault;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapPrimitive;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpResponseException;
import org.ksoap2.transport.HttpTransportSE;
import org.xmlpull.v1.XmlPullParserException;
import com.example.hicanoerp.R;
import android.os.AsyncTask;
import android.util.Log;
public class WebService {
 
 public static String WEB_SERVICE_URL =""; //"http://192.168.1.243/WebService.asmx?wsdl";
 public static String Namespace =""; //"http://tempuri.org/";//命名空间
 private WScallback serviceback; //WebService的回调函数
 
 public WebService(WScallback callback)
 {
  this.serviceback=callback;
 }
 
 /**
  * 调用WebService
  *
  * @return WebService的返回值
  *
  */
 public String CallWebService(String MethodName, Map<String, String> Params) {
  // 1、指定webservice的命名空间和调用的方法名
  SoapObject request = new SoapObject(Namespace, MethodName);
  // 2、设置调用方法的参数值,如果没有参数,可以省略,
  if (Params != null) {
   Iterator iter = Params.entrySet().iterator();
   while (iter.hasNext()) {
    Map.Entry entry = (Map.Entry) iter.next();
    request.addProperty((String) entry.getKey(),
      (String) entry.getValue());
   }
  }
  // 3、生成调用Webservice方法的SOAP请求信息。该信息由SoapSerializationEnvelope对象描述
  SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
    SoapEnvelope.VER12);
  envelope.bodyOut = request;
  // c#写的应用程序必须加上这句
  envelope.dotNet = true;
  HttpTransportSE ht = new HttpTransportSE(WEB_SERVICE_URL);
  // 使用call方法调用WebService方法
  try {
   ht.call(null, envelope);
  } catch (HttpResponseException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  } catch (XmlPullParserException e) {
   e.printStackTrace();
  }
  try {
   final SoapPrimitive result = (SoapPrimitive) envelope.getResponse();
   if (result != null) {
    Log.d("----收到的回复----", result.toString());
    return result.toString();
   }
  } catch (SoapFault e) {
   Log.e("----发生错误---", e.getMessage());
   e.printStackTrace();
  }
  return null;
 }
 
 /**
  * 执行异步任务
  *
  * @param params
  *            方法名+参数列表(哈希表形式)
  */
 public void getWebServiceData(Object... params) {
  new AsyncTask<Object, Object, String>() {
   @Override
   protected String doInBackground(Object... params) {
    try
    {
     if (params != null && params.length == 2) {
      return CallWebService((String) params[0],
        (Map<String, String>) params[1]);
     } else if (params != null && params.length == 1) {
      return CallWebService((String) params[0], null);
     } else {
      return null;
     }
    }
    catch(Exception ex)
    {
     return null;
    }
   }
   protected void onPostExecute(String result) {
    if (result != null) {
     serviceback.WSmethod(result);
    }
   };
  }.execute(params);
 } //end getWebServiceData
 
 
}
 

二、WScallback.java 接口
package com.hicano.normal;

public interface WScallback {
 public void  WSmethod(String str); 
}

三、Activity类:
public class LogoActivity extends Activity implements WScallback {
......
      WebService ws = new WebService(LogoActivity.this);//调用Webservice
      ws.getWebServiceData("getAPKVersion", values);
......
 /**
  * WebService的回调方法
  */
 public void WSmethod(String str)
 {
  if (str != null) {
   serverver=Integer.parseInt(str);
   String ver=getResources().getString(R.string.version);
   clientver=Integer.parseInt(ver);
   
   //获取服务器端版本号,与本地程序对比
   if(serverver>clientver)
   {
    handler.sendEmptyMessage(1);
   }
   else
   {
    loadMainUI();
   }
  }
  else
  {
   loadMainUI();
  }
 }
......

0 0
原创粉丝点击