加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Webservice 封装为 Thread 在主线程进行调用--Android

发布时间:2020-12-16 22:44:24 所属栏目:安全 来源:网络整理
导读:在安卓开发中,经常会使用Webservice进行网络访问获取数据,由于网络访问在新的安卓开发中不允许在主线程中运行,所以需要在子线程进行实现,为了方便进行Webservice中多个方法的调用,对Webservice操作进行了继承Thread的方式,方便开发和代码优化,对此进

在安卓开发中,经常会使用Webservice进行网络访问获取数据,由于网络访问在新的安卓开发中不允许在主线程中运行,所以需要在子线程进行实现,为了方便进行Webservice中多个方法的调用,对Webservice操作进行了继承Thread的方式,方便开发和代码优化,对此进行了总结,希望进行分享和讨论。

1.引入ksoap2-android-assembly-3.0.0jar包

2.编程Webservice线程类

public class MXNWebserviceThread extends Thread {


? ? String url="http://WebXml.com.cn";
? ? String urlPartnerServiceApi="http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx";
? ? String methodName; ? //设置方法名
? ? String result=null; ?//定义返回结果的字符串


? ? private Handler handler; //设置消息,通知主线程进行相关操作


? ? String mobileCode=null; ?//webservice 需要的参数
? ? String userID=null;


? ? public MXNWebserviceThread(String methodName,Handler handler){ ? // 构造方法,传入方法名和消息
? ? ? ? super();
? ? ? ? this.methodName=methodName;
? ? ? ? this.handler=handler;
? ? }


? ? public void setMobileCode(String mobileCode) {
? ? ? ? this.mobileCode = mobileCode;
? ? } ?//设置方法对应的参数


? ? public void setUserID(String userID) {
? ? ? ? this.userID = userID;
? ? }


? ? @Override
? ? public void run(){


? ? ? ? String str = url + "/" +methodName;
? ? ? ? SoapObject localSoapObject = new SoapObject(url,methodName);
? ? ? ? if(methodName.equals("getMobileCodeInfo")){ ? ?//根据不同的方法名,设置不同的参数
? ? ? ? ? ? System.out.println(mobileCode);
? ? ? ? ? ? localSoapObject.addProperty("mobileCode",mobileCode);
? ? ? ? ? ? localSoapObject.addProperty("userID",userID);
? ? ? ? }
? ? ? ? SoapSerializationEnvelope localSoapSerializationEnvelope = new SoapSerializationEnvelope(110);
? ? ? ? localSoapSerializationEnvelope.dotNet = true;
? ? ? ? localSoapSerializationEnvelope.bodyOut = localSoapObject;
? ? ? ? localSoapSerializationEnvelope.setOutputSoapObject(localSoapObject);
? ? ? ? HttpTransportSE localHttpTransportSE = new HttpTransportSE(urlPartnerServiceApi,3000);


? ? ? ? try ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//进行异常处理
? ? ? ? {
? ? ? ? ? ? localHttpTransportSE.call(str,localSoapSerializationEnvelope);
? ? ? ? ? ? result=((SoapObject)localSoapSerializationEnvelope.bodyIn).getProperty(0).toString();
? ? ? ? }
? ? ? ? catch (SocketTimeoutException socketTimeoutException)
? ? ? ? {
? ? ? ? ? ? socketTimeoutException.printStackTrace();
? ? ? ? ? ? result="网络异常";
? ? ? ? }
? ? ? ? catch (Exception localException)
? ? ? ? {
? ? ? ? ? ? localException.printStackTrace();
? ? ? ? ? ? result="其他异常";
? ? ? ? }


? ? ? ? Message msg=new Message();
? ? ? ? msg.what=0x123;
? ? ? ? handler.sendMessage(msg);
? ? }


? ? public String getResult(){ ? ? ? ? ? ? ? //调用此方法获取返回结果
? ? ? ? System.out.println(methodName + ":" + result);
? ? ? ? return result;


? ? }
}


3.在Activity里进行调用

?MXNWebserviceThread myThread;
? ? Handler handler;
? ? String result;


? ? @Override
? ? protected void onCreate(Bundle savedInstanceState) {
? ? ? ? super.onCreate(savedInstanceState);
? ? ? ? setContentView(R.layout.activity_main);


? ? ? ?getInfo();




? ? }


? ? private void getInfo(){
? ? ? ? handler=new Handler(){
? ? ? ? ? ? @Override
? ? ? ? ? ? public void handleMessage(Message msg) {
? ? ? ? ? ? ? ? if(msg.what==0x123){ ? ?//更新UI或其他操作
? ? ? ? ? ? ? ? ? ? result=myThread.getResult();
? ? ? ? ? ? ? ? ? ? if(result=="网络异常"||result=="其他异常"){
? ? ? ? ? ? ? ? ? ? ? ? Toast.makeText(MainActivity.this,"异常",Toast.LENGTH_LONG).show();
? ? ? ? ? ? ? ? ? ? }else{
? ? ? ? ? ? ? ? ? ? ? ? Toast.makeText(MainActivity.this,result,Toast.LENGTH_LONG).show();


? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? };


? ? ? ? myThread=new MXNWebserviceThread("getMobileCodeInfo",handler);
? ? ? ? myThread.setMobileCode("15022512067");
? ? ? ? myThread.setUserID("");
? ? ? ? myThread.start();




? ? }


这样使用起来比较方便,有效率更高,代码质量更好的欢迎进行交流讨论,共同进步。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读