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;
    } 
} 


 

通过线程进行通信。得到相同结果



出现新的问题

能够发现,运行线程中须要在线程中返回一个值,通过在run()中保存返回值。存储返回值的变量应该是MainActivity的成员变量。然后在主线程中用一个get方法取得该值。

可是run何时完毕是未知的。非常可能当第一次点击button后。依旧看不到结果,直到第二次或者很多其它才看到,所以我们须要一定的机制来保证。

 

而在Java se5就開始用Callable和Future来管理多线程了。能够解决问题。接下文。。


源代码下载

http://download.csdn.net/detail/tcl_6666/7365341


版权声明:本文博客原创文章,博客,未经同意,不得转载。





本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/4732231.html,如需转载请自行联系原作者


相关文章
|
5月前
|
监控 Android开发 数据安全/隐私保护
批量发送短信的平台,安卓群发短信工具插件脚本,批量群发短信软件【autojs版】
这个Auto.js脚本实现了完整的批量短信发送功能,包含联系人管理、短信内容编辑、发送状态监控等功能
|
Java Android开发 Swift
安卓与iOS开发对比:平台选择对项目成功的影响
【10月更文挑战第4天】在移动应用开发的世界中,选择合适的平台是至关重要的。本文将深入探讨安卓和iOS两大主流平台的开发环境、用户基础、市场份额和开发成本等方面的差异,并分析这些差异如何影响项目的最终成果。通过比较这两个平台的优势与挑战,开发者可以更好地决定哪个平台更适合他们的项目需求。
330 1
|
9月前
|
存储 编解码 监控
Android平台GB28181执法记录仪技术方案与实现
本文介绍了大牛直播SDK的SmartGBD在执法记录仪场景中的应用。GB28181协议作为视频监控联网的国家标准,为设备互联互通提供规范。SmartGBD专为Android平台设计,支持音视频采集、编码与传输,具备自适应算法和多功能扩展优势。文章分析了执法记录仪的需求,如实时音视频传输、设备管理及数据安全,并详细阐述了基于SmartGBD的技术实现方案,包括环境准备、SDK集成、设备注册、音视频处理及功能扩展等步骤。最后展望了SmartGBD在未来智慧物联领域的广阔应用前景。
569 13
|
9月前
|
存储 编解码 开发工具
Android平台毫秒级低延迟HTTP-FLV直播播放器技术探究与实现
本文详细探讨了在Android平台上实现HTTP-FLV播放器的过程。首先介绍了FLV格式的基础,包括文件头和标签结构。接着分析了HTTP-FLV传输原理,通过分块传输实现流畅播放。然后重点讲解了播放器的实现步骤,涵盖网络请求、数据解析、音视频解码与渲染,以及播放控制功能的设计。文章还讨论了性能优化和网络异常处理的方法,并总结了HTTP-FLV播放器的技术价值,尤其是在特定场景下的应用意义。
454 11
|
9月前
|
监控 Shell Linux
Android调试终极指南:ADB安装+多设备连接+ANR日志抓取全流程解析,覆盖环境变量配置/多设备调试/ANR日志分析全流程,附Win/Mac/Linux三平台解决方案
ADB(Android Debug Bridge)是安卓开发中的重要工具,用于连接电脑与安卓设备,实现文件传输、应用管理、日志抓取等功能。本文介绍了 ADB 的基本概念、安装配置及常用命令。包括:1) 基本命令如 `adb version` 和 `adb devices`;2) 权限操作如 `adb root` 和 `adb shell`;3) APK 操作如安装、卸载应用;4) 文件传输如 `adb push` 和 `adb pull`;5) 日志记录如 `adb logcat`;6) 系统信息获取如屏幕截图和录屏。通过这些功能,用户可高效调试和管理安卓设备。
|
IDE 开发工具 Android开发
移动应用开发之旅:探索Android和iOS平台
在这篇文章中,我们将深入探讨移动应用开发的两个主要平台——Android和iOS。我们将了解它们的操作系统、开发环境和工具,并通过代码示例展示如何在这两个平台上创建一个简单的“Hello World”应用。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的信息和技巧,帮助你更好地理解和掌握移动应用开发。
310 17
|
Unix Linux PHP
PHP在Web开发中的平台独立性优势###
本文探讨了PHP的跨平台特性,阐述其作为服务器端脚本语言如何在不同操作系统上无缝运行,以及这一特性为开发者和组织带来的便利性和成本效益。 ###
【Azure App Service】PowerShell脚本批量添加IP地址到Web App允许访问IP列表中
Web App取消公网访问后,只允许特定IP能访问Web App。需要写一下段PowerShell脚本,批量添加IP到Web App的允许访问IP列表里!
219 2
|
缓存 安全 JavaScript
PHP在Web开发中的平台优势与未来趋势###
【10月更文挑战第21天】 PHP,Hypertext Preprocessor,凭借其灵活性、广泛应用和强大社区支持,已成为Web开发的常青树。本文探讨了PHP的发展历程、核心优势、最佳实践案例及面临的挑战与机遇,揭示其在现代Web开发中不可替代的角色,以及如何适应未来技术趋势,持续引领Web创新。 ###
200 2
|
设计模式 PHP 开发者
PHP在Web开发中的平台优势与未来展望###
【10月更文挑战第17天】 本文探讨了PHP作为服务器端脚本语言在Web开发领域的持久魅力与独特优势,从其易于学习、成本效益高、强大社区支持到灵活的框架生态,展现了PHP为何能在全球网站开发中占据重要地位。同时,文章也展望了PHP在未来技术趋势下,如云计算、微服务架构中的发展潜力,强调持续创新对于保持其竞争力的重要性。 ###
129 2