基於ksoap2-android的soap的封裝


實例基於ksoap2-android-assembly-3.3.0-jar-with-dependencies.jar

1:定義回調接口,通過泛型確定返回值類型

package com.ciii.bd.electrombile.soap;

/**
* 處理請求服務器的回調接口
* Created by lipanquan on 2016/12/26.
*/
public class SoapCallback<ResponseResult> {
/**
* 請求失敗處理的結果,Run main thread
*/
public void onFailResult() {

}

/**
* 請求成功處理的結果,Run main thread
*
* @param responseResult 請求成功處理后的結果
*/
public void onResponseResult(ResponseResult responseResult) {

}

/**
* onResponseResult 方法之后執行
*/
public void onFinally() {

}
}

2:處理Soap請求的工具類,通過反射和泛型配合直接回調給調用者指定泛型的結果


import android.os.Handler;
import android.os.Looper;
import android.os.Message;

import com.ciii.base.utils.GsonUtils;
import com.ciii.bd.electrombile.okhttp.OkHttpCallback;

import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapPrimitive;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Map;

/**
* 處理Soap請求的工具類
* Created by lipanquan on 2016/12/26.
*/
public class SoapNetUtils {

/**
* 請求處理成功的回調標示
*/
private static final int MESSAGE_POST_SUCCESS = 0x1;

/**
* 請求處理失敗的回調標示
*/
private static final int MESSAGE_POST_FAIL = 0x2;

/**
* 命名空間
*/
private static String namespace;

/**
* 服務器的地址
*/
private static String url;

private SoapNetUtils() {
}

private static SoapNetUtils instance = new SoapNetUtils();

/**
* 獲取處理Soap請求的工具類
*
* @return 處理Soap請求的工具類
*/
public static SoapNetUtils getInstance() {
return instance;
}

/**
* 初始化Soap協議請求工具類對象
*
* @param namespace 命名空間
* @param url 服務器的地址
*/
public void initSoap(String namespace, String url) {
SoapNetUtils.namespace = namespace;
SoapNetUtils.url = url;
if (SoapNetUtils.namespace == null || SoapNetUtils.namespace.equals("") ||
SoapNetUtils.url == null || SoapNetUtils.url.equals("")) {
throw new RuntimeException("namespace不能為空,並且url不能為空。初始化Soap協議請求工具類對象失敗");
}
}

/**
* 執行請求
*
* @param t 指定返回結果的class對象文件
* @param urlType 請求的標示類型
* @param parameters 參數列表
* @param callback 回調函數
* @param <T> 指定返回結果的class對象文件
*/
public <T> void doSoapRequest(final Class<T> t, final String urlType, final Map<String, Object> parameters, final SoapCallback callback) {
if (SoapNetUtils.namespace == null || SoapNetUtils.namespace.equals("") ||
SoapNetUtils.url == null || SoapNetUtils.url.equals("")) {
throw new RuntimeException("initSoap(String namespace, String url)方法進行初始化Soap協議請求工具類之后再使用...");
}
new Thread(new Runnable() {
@Override
public void run() {
try {
T result = doSoap(t, urlType, parameters, callback);
                    //向主線程發送消息成功,getTelAddress函數執行完畢
Message msg = Message.obtain();
msg.what = MESSAGE_POST_SUCCESS;
msg.obj = new MyExecuteTaskResult<T>(callback, result);
getHandler().sendMessage(msg);
} catch (Exception e) {
//向主線程發送消息成功,getTelAddress函數執行完畢
Message msg = Message.obtain();
msg.what = MESSAGE_POST_FAIL;
msg.obj = new MyExecuteTaskResult<T>(callback, null);
getHandler().sendMessage(msg);
}
}
}).start();
}

/**
* 正真執行網絡請求
*
* @param t 指定返回結果的class對象文件
* @param urlType 請求的標示類型
* @param parameters 參數列表
* @param callback 回調函數
* @param <T> 指定返回結果的class對象文件
*/
private <T> T doSoap(Class<T> t, String urlType, Map<String, Object> parameters, SoapCallback callback) throws Exception {
Object instance = t.newInstance();
SoapObject soapObject = new
SoapObject(namespace, urlType);//"UserLogin"創建SOAP對象
//設置屬性,這些屬性值通過SOAP協議傳送給服務器
Iterator<Map.Entry<String, Object>> it = parameters.entrySet().iterator();
while (it.hasNext()) {
Map.Entry<String, Object> entry = it.next();
if (entry.getValue() instanceof ArrayList) {
SoapObject parameterValue = new SoapObject();
for (String str : (ArrayList<String>)entry.getValue()) {
parameterValue.addProperty("long", Long.valueOf(str));
}
soapObject.addProperty(entry.getKey(), parameterValue);
} else
soapObject.addProperty(entry.getKey(), entry.getValue());
}
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
SoapEnvelope.VER11);
envelope.bodyOut = soapObject;
envelope.dotNet = true;
envelope.setOutputSoapObject(soapObject);
HttpTransportSE httpTransportSE = new HttpTransportSE(url);
try {
//調用服務
httpTransportSE.call(namespace + urlType, envelope);
} catch (Exception e) {
e.printStackTrace();
}
if (envelope.bodyIn instanceof SoapObject) {
SoapObject response = (SoapObject) envelope.bodyIn;
Field[] fields = instance.getClass().getDeclaredFields();
for (int i = 0; i < fields.length; i++) {
fields[i].setAccessible(true);
Class<?> type = fields[i].getType();
Object fieldValue;
try {
fieldValue = response.getProperty(fields[i].getName());
} catch (Exception e) {
continue;
}
Object o;
if (fieldValue instanceof SoapPrimitive) {
o = GsonUtils.getInstance().j2O(fieldValue.toString(), type);
fields[i].set(instance, o);
} else if (fieldValue instanceof SoapObject) {
if (type == ArrayList.class) {
SoapObject object = (SoapObject) fieldValue;
o = new ArrayList();
Method m = o.getClass().getMethod("add", Object.class);
for (int j = 0; j < object.getPropertyCount(); j++) {
SoapPrimitive primitive = (SoapPrimitive) object.getProperty(j);
m.invoke(o, primitive.getValue());
}
fields[i].set(instance, o);
}
continue;
} else {
continue;
}
fields[i].set(instance, o);
}
}
return (T) instance;
}
private static InternalHandler sHandler;
private static Handler getHandler() {
synchronized (OkHttpCallback.class) {
if (sHandler == null) {
sHandler = new InternalHandler();
}
return sHandler;
}
}
private static class MyExecuteTaskResult<Result> {
@SuppressWarnings("rawtypes")
final SoapCallback mTask;
final Result mData;
public MyExecuteTaskResult(SoapCallback task,
Result data) {
mTask = task;
mData = data;
}
}
private static class InternalHandler extends Handler {
public InternalHandler() {
super(Looper.getMainLooper());
}
@SuppressWarnings("unchecked")
@Override
public void handleMessage(Message msg) {
MyExecuteTaskResult<?> result = (MyExecuteTaskResult<?>) msg.obj;
switch (msg.what) {
case MESSAGE_POST_SUCCESS:
result.mTask.onResponseResult(result.mData);
break;
case MESSAGE_POST_FAIL:
result.mTask.onFailResult();
break;
}
result.mTask.onFinally();
}
}
}
 
         
         
        
3:使用
SoapNetUtils.getInstance().doSoapRequest(User.class, URL_TYPE_LOGIN, parameters, new SoapCallback<User>() {
@Override
public void onResponseResult(User user) {
if (user.isLoginSuccessed()) {
user.setUserName(et_login_username.getText().toString());
// 保存用戶名和密碼
putString(SPKey.KEY_USERNAME, et_login_username.getText().toString().trim());
if (isAutoLogin)
putString(SPKey.KEY_PASSWORD, et_login_password.getText().toString().trim());
getMyApplication().setCurrentUser(user);
showToastShort(R.string.toast_login_success);
startEnterActivity(SelectDeviceListActivity.class, true);
} else {
showToastShort(R.string.toast_login_fail);
}
}

@Override
public void onFailResult() {
showToastShort(R.string.toast_login_fail);
}

@Override
public void onFinally() {
btn_login.setEnabled(true);
dismissMDialog();
}
});
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM