微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

在安卓开发中,经常会使用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();




    }


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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐