Android平台调用Web Service:螺纹的引入
连接文本
剩下的问题
MainActivity的onCreate方法中假设没有有这段代码:
// 强制在UI线程中操作
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
.detectDiskReads().detectDiskWrites().detectNetwork()
.penaltyLog().build()); StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
.detectLeakedSqlLiteObjects().penaltyLog().penaltyDeath()
.build());
会报错误例如以下:
FATAL EXCEPTION:main
java.lang.NullPointerException
atcom.example.demoservice.MainActivity.getRemoteInfo(MainActivity.java:91)
atcom.example.demoservice.MainActivity$1.onClick(MainActivity.java:51)
这是由于android 3.0+以上 已经不建议在activity中加入耗时操作,要界面和数据脱离。4.0以上的通信都必须放到线程里去做,不能在UI线程。解决的方法是另起线程。假设一定要想在UI线程操作,就须要加入如上代码。
显然这样做是不可取的。由于通信消耗时间长。可能会让用户傻傻的等待,那么接下来就通过引入线程来解决问题。
通过Runnable接口和Thread类创建线程
我们能够用Runnable接口和Thread类创建线程,从而舍弃强制使用UI主线程的方式。代码例如以下(同一时候对代码进行了整理,把nameSpace等变量抽出来)
public classMainActivity extends Activity { 
    public static final String TAG ="webService_pj";
    private EditText phoneSecEditText;
    private TextView resultView;
    private Button queryButton; 
    @Override
    public void onCreate(BundlesavedInstanceState) { 
//           StrictMode.setThreadPolicy(newStrictMode.ThreadPolicy.Builder()
//       .detectDiskReads().detectDiskWrites().detectNetwork()
//        .penaltyLog().build());
//
//    StrictMode.setVmPolicy(newStrictMode.VmPolicy.Builder()
//       .detectLeakedSqlLiteObjects().penaltyLog().penaltyDeath()
//        .build());
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main); 
        phoneSecEditText = (EditText)findViewById(R.id.phone_sec);
        resultView = (TextView)findViewById(R.id.result_text);
        queryButton = (Button)findViewById(R.id.query_btn); 
        queryButton.setOnClickListener(newOnClickListener() {
            @Override
            public void onClick(View v) { 
                   Log.i(TAG,"MainActivity线程ID:"+Thread.currentThread().getId());
                // 手机号码(段)
                String phoneSec =phoneSecEditText.getText().toString().trim();
                // 简单推断用户输入的手机号码(段)是否合法
                if("".equals(phoneSec) || phoneSec.length() < 7) {
                    // 给出错误提示
                   phoneSecEditText.setError("您输入的手机号码(段)有误。");
                   phoneSecEditText.requestFocus();
                    // 将显示查询结果的TextView清空
                   resultView.setText("");
                    return;
                } 
                // 命名空间
                String nameSpace = "http://WebXml.com.cn/";
                // 调用的方法名称
                String methodName ="getMobileCodeInfo";
                // EndPoint
                String endPoint = "http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx";
                // SOAP Action
                String soapAction = "http://WebXml.com.cn/getMobileCodeInfo";
                // method params and values
                ArrayList<String> params= new ArrayList<String>();
                ArrayList<Object> vals =new ArrayList<Object>();
               params.add("mobileCode");
                params.add("userId");
                vals.add(phoneSec);
                vals.add("");
                // 通过Runnable接口和Thread类 创建线程调用WebService
                   newMyThread(nameSpace,methodName,endPoint,soapAction,
                                                           params,vals).start();
                       //将WebService返回的结果显示在TextView中
                   resultView.setText(getResult());
            }
        });
    } 
//通过Runnable接口和Thread类,得到线程返回值
privateString result;
publicString getResult(){
returnresult;
}
    private class MyThread extends Thread
{
    private String nameSpace;
    private String methodName;
    private String endPoint;
    private String soapAction;
        private ArrayList<String> params;
        private ArrayList<Object> vals;
    public MyThread(String nameSpace,  String methodName,
                   StringendPoint, String soapAction, ArrayList<String> params,ArrayList<Object> vals){
        this.nameSpace = nameSpace;
        this.methodName = methodName;
        this.endPoint = endPoint;
        this.soapAction = soapAction;
        this.params = params;
        this.vals = vals;
    } 
@Override
publicvoid run()
{
Log.i(TAG,"MyService线程ID:"+Thread.currentThread().getId());
result= getRemoteInfo(nameSpace, methodName, endPoint,
                                soapAction,params,vals);
}
}
    /**
     *@MethodName        : getRemoteInfo
     *@Description        : 调用远程webservice方法
     * @param nameSpace
     * @param methodName
     * @param endPoint
     * @param soapAction
     * @param params
     * @param vals
     * @return
     */
    public String getRemoteInfo(StringnameSpace,  String methodName,
                                   StringendPoint, String soapAction, ArrayList<String> params,
                                   ArrayList<Object>vals) { 
        // 指定WebService的命名空间和调用的方法名
        SoapObject rpc = newSoapObject(nameSpace, methodName); 
        //设置需调用WebService接口须要传入的两个參数mobileCode、userId
        for (int i = 0; i < params.size();i++) {
rpc.addProperty(params.get(i),vals.get(i));
}
        //生成调用WebService方法的SOAP请求信息,并指定SOAP的版本号
        SoapSerializationEnvelope envelope =new SoapSerializationEnvelope(SoapEnvelope.VER10); 
        envelope.bodyOut = rpc;
        // 设置是否调用的是dotNet开发的WebService
//        envelope.dotNet = true;
        // 等价于envelope.bodyOut = rpc;
        envelope.setOutputSoapObject(rpc); 
        HttpTransportSE transport = newHttpTransportSE(endPoint);
        try {
            // 调用WebService
            transport.call(soapAction,envelope);
        } catch (Exception e) {
            e.printStackTrace();
        } 
        // 获取返回的数据
        SoapObject object = (SoapObject)envelope.bodyIn; 
        String result = "";
        if (object != null) {
               // 获取返回的结果
               result =object.getProperty(0).toString();
        }
        return result;
    }
} 
通过线程进行通信。得到相同结果
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdGNoOTE4/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
出现新的问题
能够发现。运行线程中须要在线程中返回一个值,通过在run()中保存返回值。存储返回值的变量应该是MainActivity的成员变量,然后在主线程中用一个get方法取得该值。
可是run何时完毕是未知的,非常可能当第一次点击button后,依旧看不到结果,直到第二次或者很多其它才看到。所以我们须要一定的机制来保证。
而在Java se5就開始用Callable和Future来管理多线程了,能够解决问题。接下文。。。
源代码下载
http://download.csdn.net/detail/tcl_6666/7365341
版权声明:本文博主原创文章,博客,未经同意不得转载。
Android平台调用Web Service:螺纹的引入的更多相关文章
- Android平台调用Web Service:演示样例
		近期在学习Android,随着移动设备的流行,当软件走上商业化的道路,为了争夺市场,肯定须要支持Android的,所以開始接触了Android,只是仅仅了解皮毛就好,由于我们要做管理者嘛,懂点Andr ... 
- Android平台调用Web Service:线程返回值
		接上文 前文中的遗留问题 对于Java多线程的理解,我曾经只局限于实现Runnable接口或者继承Thread类.然后重写run()方法.最后start()调用就算完事,可是一旦涉及死锁以及对共享资源 ... 
- andorid 平台调用Web Service , 图片传输
		今天学习了下android调用web service,进行图片传输 下面是代码详解: onActivityResult 方法在图片剪裁完成之后调用: protected void onActivity ... 
- Android平台调用WebService详解
		上篇文章已经对Web Service及其相关知识进行了介绍(Android开发之WebService介绍 ),相信有的朋友已经忍耐不住想试试在Android应用中调用Web Service.本文将通过 ... 
- Apache CXF实现Web Service(4)——Tomcat容器和Spring实现JAX-RS(RESTful) web service
		准备 我们仍然使用 Apache CXF实现Web Service(2)——不借助重量级Web容器和Spring实现一个纯的JAX-RS(RESTful) web service 中的代码作为基础,并 ... 
- Linux下用gSOAP开发Web Service服务端和客户端程序
		网上本有一篇流传甚广的C版本的,我参考来实现,发现有不少问题,现在根据自己的开发经验将其修改,使用无误:另外,补充同样功能的C++版本,我想这个应该更有用,因为能用C++,当然好过受限于C. 1.gS ... 
- 用Jersey为Android客户端开发Restful Web Service
		平时在做Android客户端的时候经常要与服务器之间通信,客户端通过服务端提供的接口获取数据,然后再展示在客户端的界面上,作为Android开发者,我们平时更多的是关注客户端的开发,而对服务端开发的关 ... 
- 使用Android应用调用Web  Service
		Java本身提供了丰富的Web Service支持,比如Sun公司指定的JAX-WS 2规范,还有Apache开源组织所提供的Axis1.Axis2.CXF等,这些技术不仅可以用于非常方便地对外提 ... 
- Android调用Asp.net Web Service示例
		WebService代码: using System; using System.Collections.Generic; using System.Linq; using System.Web; u ... 
随机推荐
- 微信支付[v3]
			原文:微信支付[v3] V2升级V3 顺便记录一下 ,文档: http://pay.weixin.qq.com/wiki/doc/api/index.html !!! 支付授权目录与测试人的微信帐号白 ... 
- 跟Google学习Android开发-起始篇-与其它应用程序交互(2)
			6.2从活动获取结果 启动另一个活动不必是单向的.您也可以启动另一个活动,并接收一个结果回来.为了接收一个结果,调用startActivityForResult()(而不是startActivity( ... 
- VS2005 MFC 预编译头文件来自编译器的早期版本,或者预编译头为 C++ 而在 C 中使用它(或相反)
			当 Visual C++ 项目启用了预编译头 (Precompiled header) 功能时,如果项目中同时混合有 .c 和 .cpp 源文件,则可能收到 C1853 编译器错误:fatal err ... 
- Please verify you invoked Maven from the correct directory
			解决办法: 在cmd中,把当前路径转换到一个含有pom文件的 项目路径下 再使用 类似下面的deploy就行 mvn deploy:deploy-file -DgroupId=com.taobao.n ... 
- 浅谈mapreduce程序部署
			尽管我们在虚拟机client上能非常快通过shell命令,进行运行一些已经封装好实例程序,可是在应用中还是是自己敲代码,然后部署到server中去,以下,我通过程序进行浅谈一个程序的部署过程. 在启动 ... 
- 排列-条件求和(Code)
			static void Main(string[] args) { // Generate data int arraySize; int[] data; Random rnd; arraySize ... 
- 可能性dp+减少国家HDU4336
			Card Collector Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Subm ... 
- 使用visual c++ 2005远程调试64位系统上32位与64位程序
			一直都挺喜欢使用visual c++远程调试代码,它能展现给我们当时代码执行最真实的情景,今天有时间记录一下,以免以后忘了. 远程调试需要在被调试端安装服务器,对于visual c++ 2005来说调 ... 
- Jedi项目,还真得好好看看,有许多控件和新封装的API(Delphi里面没有)
			以前没有重视 http://www.delphi-jedi.org/ https://github.com/project-jedi https://sourceforge.net/projects/ ... 
- js 常用正则表达式分析详解
			1.整数或者小数:/^((0{1}|[1-9]{1}[0-9]+)\.{1}[0-9]+|[1-9]{1}[0-9]*|0)$/ 分析:分类讨论,如果是小数,则有两种形式 0.111对应的是 0{ ... 
