首页 文章 精选 留言 我的

精选列表

搜索[web],共10000篇文章
优秀的个人博客,低调大师

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,如需转载请自行联系原作者

优秀的个人博客,低调大师

使用Dockerfile构建镜像-Docker for Web Developers(5)

1.理解Dockerfile语法 语法命令 命令功能 举例 FROM 所有的dockerfile都必须以FROM命令指定镜像基于哪个基础镜像来制作 FROM ubuntu:14:04 MAINTAINER 该容器维护作者,一般是作者的电子邮件 MAINTAINERliminjun2007@gmail.com RUN 在shell或者exec的环境下执行的命令,run指令会在新创建的镜像添加新的层面,接下来提交的结果用在dockerfile的下一条指令中。 RUN echo "Hello World" > /root/hello_world.txt CMD 提供容器默认的执行命令,dockerfile只允许使用一次CMD命令,如果执行多次,最后一次自动替换之前的。 CMD ["cat", "/root/hello_world.txt"] 更多详细语法可以参考:Dockerfile语法 2.编写一个简单的Dockerfile #FROM - Image to start building on. FROM ubuntu:14.04 #MAINTAINER - Identifies the maintainer of the dockerfile. MAINTAINER liminjun2007@gmail.com #RUN - Runs a command in the container RUN echo "Hello World" > /root/hello_world.txt #CMD - Identifies the command that should be used by default when running the image as a container. CMD ["cat", "/root/hello_world.txt"] Dockerfile文件放到simple-dockerfile文件夹下面,切换到simple-dockerfile文件夹下,执行命令: docker build -t simple . 运行结果如下图所示: 运行simple容器,执行命令之后运行结果如下: root@ubuntu-512mb-sfo2-01-gfw:~/simple-dockerfile# docker run simple Hello world 3.参考链接 Dockerfile语法 Dockerfile 最佳实践 Dockerfile 构建镜像 - 每天5分钟玩转容器技术(13) 本文转自快乐八哥博客园博客,原文链接http://www.cnblogs.com/liminjun88/p/using-dockerfile-to-build-docker-image.html如需转载请自行联系原作者 快乐八哥

资源下载

更多资源
优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册