以下是根據自己項目做得簡單封裝,作爲自己的筆記,僅供參考
1.libs中添加jar包
ksoap2-android-assembly-3.0.0-jar-with-dependencies.jar
2.app build.gradle中添加
androidTestImplementation files('libs/ksoap2-android-assembly-3.0.0-jar-with-dependencies.jar')
自己做的簡單封裝
3.HttpSoapUtils
package zz.bole.bl_pl_qsjh.utils; import android.content.Context; import android.os.Handler; import android.os.Looper; import android.widget.Toast; import org.ksoap2.SoapEnvelope; import org.ksoap2.serialization.SoapObject; import org.ksoap2.serialization.SoapSerializationEnvelope; import org.ksoap2.transport.HttpTransportSE; import org.kxml2.kdom.Element; import org.kxml2.kdom.Node; import java.net.ConnectException; import java.net.SocketTimeoutException; import java.util.Map; import zz.bole.bl_pl_qsjh.R; import zz.bole.bl_pl_qsjh.retrofit.NetworkUtil; public class HttpSoapUtils { public static void sendPostRequest(String methodName, String endPointurl, String soapActionurl, Map<String, String> mapParams, final ResultHandler resultHandler) { // 判斷網絡連接狀況 if (resultHandler.isNetDisconnected()) { resultHandler.onAfterFailure(); return ; } resultHandler.onBeforeResult(); //空間名字,和服務器地址一致 String nameSpace = "http://tempuri.org/"; //建立soapheader,用header傳UserName和PassWord Element[] header = new Element[1]; header[0] = new Element().createElement(nameSpace, "CredentialSoapHeader"); Element uname = new Element().createElement(nameSpace, "UserName"); uname.addChild(Node.TEXT, "test");//<UserName>xxx</UserName> header[0].addChild(Node.ELEMENT, uname); Element pass = new Element().createElement(nameSpace, "Password"); pass.addChild(Node.TEXT, "123");//<Password>xxx</Password> header[0].addChild(Node.ELEMENT, pass); SoapObject so = new SoapObject(nameSpace, methodName); for (String key : mapParams.keySet()) { so.addProperty(key, mapParams.get(key)); } SoapSerializationEnvelope envelope=new SoapSerializationEnvelope(SoapEnvelope.VER12); envelope.headerOut=header; envelope.bodyOut=so; envelope.dotNet=true; envelope.setOutputSoapObject(so); HttpTransportSE transport=new HttpTransportSE(endPointurl); try { transport.call(soapActionurl, envelope);// 調用WebService } catch (Exception e) { e.printStackTrace(); } SoapObject object=(SoapObject)envelope.bodyIn;// 獲取返回的數據 if (object == null) { resultHandler.onServerError(); return; } String string = object.getProperty(0).toString(); resultHandler.onResult(string); } /** * 網絡請求結果處理類 * */ public static abstract class ResultHandler{ Context context; public ResultHandler(Context context) { this.context = context; } /** * 判斷網絡是否未連接 * * @return */ public boolean isNetDisconnected() { return NetworkUtil.isNetDisconnected(context); } /** * 請求成功之前 */ public abstract void onBeforeResult(); /** * 請求成功時 * * @param t 結果數據 */ public abstract void onResult(String t); /** * 服務器出錯 */ public void onServerError() { // 服務器處理出錯 new Thread(new Runnable() { @Override public void run() { Handler handler = new Handler(Looper.getMainLooper()); handler.post(new Runnable() { @Override public void run() { Toast.makeText(context, R.string.net_server_error, Toast.LENGTH_SHORT).show(); } }); } }).start(); } /** * 請求失敗後的處理 */ public abstract void onAfterFailure(); /** * 請求失敗時的處理 * * @param t */ public void onFailure(Throwable t) { if (t instanceof SocketTimeoutException || t instanceof ConnectException) { // 連接異常 if (NetworkUtil.isNetworkConnected(context)) { // 服務器連接出錯 Toast.makeText(context, R.string.net_server_connected_error, Toast.LENGTH_SHORT).show(); } else { // 手機網絡不通 Toast.makeText(context, R.string.net_not_connected, Toast.LENGTH_SHORT).show(); } } else if (t instanceof Exception) { // 功能異常 Toast.makeText(context, R.string.net_unknown_error, Toast.LENGTH_SHORT).show(); } } } }
4.手機網絡監測工具
NetworkUtil
package zz.bole.bl_pl_qsjh.retrofit; import android.content.Context; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.os.Handler; import android.os.Looper; import android.widget.Toast; import zz.bole.bl_pl_qsjh.R; /** * 手機網絡監測工具 */ public class NetworkUtil { /** * 檢測網絡連接狀態 * * @param context * @return */ public static boolean isNetworkConnected(Context context) { if (context != null) { ConnectivityManager mConnectivityManager = (ConnectivityManager) context .getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo mNetworkInfo = mConnectivityManager.getActiveNetworkInfo(); if (mNetworkInfo != null) { return mNetworkInfo.isAvailable(); } } return false; } /** * 網絡是否未連接 * <p>未連接時給出提示</p> * * @param context * @return boolean 是否連接網絡 */ public static boolean isNetDisconnected(Context context) { if (!isNetworkConnected(context)) { toastTest(context); return true; } return false; } private static void toastTest(final Context context) { new Thread(new Runnable() { @Override public void run() { Handler handler = new Handler(Looper.getMainLooper()); handler.post(new Runnable() { @Override public void run() { Toast.makeText(context, R.string.net_not_connected, Toast.LENGTH_SHORT).show(); } }); } }).start(); } /** * 判斷用戶是否連接在wifi下 * * @param context * @return */ public static boolean isConnectedByWifi(Context context) { ConnectivityManager mConnectivityManager = (ConnectivityManager) context .getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = mConnectivityManager.getActiveNetworkInfo(); if (networkInfo != null) { return networkInfo.getType() == ConnectivityManager.TYPE_WIFI ? true : false; } return false; } }
5.Activity代碼具體使用
new Thread(new Runnable() {
@Override
public void run() {
}
}).start();
以下需要在子線程中使用
HashMap<String, String> hashMap = new HashMap<>();
hashMap.put("code",username);
hashMap.put("password",pwd);
String methodName = "Login";
String endPointurl = urladdress+Urls.BASE_URL; //http://192.168.200.12:8001/TESTService.asmx
String soapActionurl = urladdress+Urls.LOGIN; //http://192.168.200.12:8001/TESTService.asmx/Login
HttpSoapUtils.sendPostRequest(methodName, endPointurl, soapActionurl, hashMap, new HttpSoapUtils.ResultHandler(mContext) {
@Override
public void onBeforeResult() {
}
@Override
public void onResult(String t) {
//對字符串解析操作
}
@Override
public void onAfterFailure() {
}
});