透彻理解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();
}
}
......
}
一、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();
}
}
......
}
相关文章推荐
- C#(服务器)与Java(客户端)通过Socket传递对象
- Liferay环境搭建以及与Eclipse的使用
- Java EE的安全机制
- eclipse颜色配置
- 你应当知道的Java牛人
- java反射快速入门(二)
- java try catch
- List<T>排序,java和c#都用得到
- Eclipse代码提示
- 下载、安装jdk8(Windows下)并配置变量环境
- spring aop自动代理注解配置失效问题及原理机制整理总结
- logback与Spring、SpringMVC结合使用教程
- java设计模式之策略模式
- eclipse 设置字体大小
- 【java基础】J2EE视频总结
- eclipse xml 注释快捷键
- Java复制图片小例子
- 空指针错误 java.lang.NullPointerException
- JAVA——基础语法(二)
- eclipse 如何配制项目编译JDK版本