您的位置:首页 > 编程语言 > Java开发

透彻理解Java回调函数

2016-02-05 16:54 507 查看
做了一个安卓访问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();

  }

 }

......

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: