使用Android Studio开发调用.NET Webservice 之初体验
2016-07-20 14:24
597 查看
本人是。NET出身 但苦于领导要让研究Android 外壳然后准备套html5 ,当试验兵真坑啊 但也没办法 咱还得研究啊,索性 不辜负领导的期望(也研究好两三天了)总算弄明白了 app本地存储 和 Android Studio 调用 Webservice 了,中间出现了好几处问题 ,自己也百度了好久 都没有解决我的问题,且它们那些答案都是复制粘贴下根本就没有测试可不可以 就贴出来了 这我就很气愤啊 下面为了给和我一样的新手和想研究的各位一点便利,把自己遇到的问题与如何解决分享下 以便自己也加深印象。
如有不对了还请不要喷 请@我呦!
1.首先本人做的也是简单webserivce且能调试通就可以,所以新建了一个空网站:
名字可以随便取的啦。
2.最好在建立一个web窗体,这样你在发布的时候就有个初始的页面了,不至于没有初始页面。
里面文字随便写下:初始Index
3.新建一个WebService 服务:便于测试 随便返回几个文字就好:
以上就是C# VS webservice的创建了,下面才是重头戏:Android Studio开始
在写代码之前需要下载并导入jar 工具类包。
Google为Android平台开发Web Service客户端提供了ksoap2-android项目,但这个项目并未直接集成在Android平台中,还需要开发人员自行下载。为Android应用增加ksoap2-android运行请按如下步骤进行:
1.1 登录http://simpligility.github.io/ksoap2-android/getting-started.html站点,下拉一直到如下界面。(另:再见,Google Code,你好,GitHub)
此时最新为3.6.1,我下载的是3.3.0。
1.2 切换到Project面板
将ksoap2JAR包直接复制粘贴到app->libs目录下
右键Add as Library…,弹出对话框,OK就行了。
调用webserivce时返回错误:服务器未能识别 HTTP 头 SOAPAction 的值: http://tempuri.org/HelloWorld/......省略。
如有不对了还请不要喷 请@我呦!
1.首先本人做的也是简单webserivce且能调试通就可以,所以新建了一个空网站:
名字可以随便取的啦。
2.最好在建立一个web窗体,这样你在发布的时候就有个初始的页面了,不至于没有初始页面。
里面文字随便写下:初始Index
3.新建一个WebService 服务:便于测试 随便返回几个文字就好:
以上就是C# VS webservice的创建了,下面才是重头戏:Android Studio开始
在写代码之前需要下载并导入jar 工具类包。
Google为Android平台开发Web Service客户端提供了ksoap2-android项目,但这个项目并未直接集成在Android平台中,还需要开发人员自行下载。为Android应用增加ksoap2-android运行请按如下步骤进行:
1.1 登录http://simpligility.github.io/ksoap2-android/getting-started.html站点,下拉一直到如下界面。(另:再见,Google Code,你好,GitHub)
此时最新为3.6.1,我下载的是3.3.0。
1.2 切换到Project面板
将ksoap2JAR包直接复制粘贴到app->libs目录下
右键Add as Library…,弹出对话框,OK就行了。
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.example.user.app_webservice3.MainActivity"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World!" android:id="@+id/textView" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="显示" android:id="@+id/button" android:layout_below="@+id/textView" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:layout_marginTop="109dp" /> </RelativeLayout> design界面如下图所示: 4. MainActivity.java
//访问网络同时加入这个 @SuppressLint("NewApi") protected void onCreate(Bundle savedInstanceState) { //允许使用webervice同时启用网络访问 StrictMode.ThreadPolicy policy=new StrictMode.ThreadPolicy.Builder().permitAll().build(); StrictMode.setThreadPolicy(policy); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); queryButton = (Button) findViewById(R.id.button); queryButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { getRemoteInfo(); } }); }
public void getRemoteInfo() { // 命名空间 String nameSpace = "http://tempuri.org/"; // 调用的方法名称 String methodName = "HelloWorld"; // EndPoint String endPoint = "http://192.168.16.39:1215/WebService.asmx"; // SOAP Action String soapAction = "http://tempuri.org//HelloWorld/"; // 指定WebService的命名空间和调用的方法名 SoapObject rpc = new SoapObject(nameSpace, methodName); // 设置需调用WebService接口需要传入的两个参数mobileCode、userId //rpc.addProperty("mobileCode", phoneSec); //rpc.addProperty("userId", ""); // 生成调用WebService方法的SOAP请求信息,并指定SOAP的版本 SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER12); envelope.bodyOut = rpc; // 设置是否调用的是dotNet开发的WebService envelope.dotNet = true; (new MarshalBase64()).register(envelope); // 等价于envelope.bodyOut = rpc; envelope.setOutputSoapObject(rpc); HttpTransportSE transport = new HttpTransportSE(endPoint); transport.debug=true; try { // 调用WebService transport.call(soapAction, envelope); if (envelope.getResponse() != null) { System.out.println(envelope.getResponse()); result = String.valueOf(envelope.getResponse()); Toast.makeText(MainActivity.this, result, Toast.LENGTH_SHORT) .show(); } } catch (Exception e) { e.printStackTrace(); }
报错总结:
调用webserivce时返回错误:服务器未能识别 HTTP 头 SOAPAction 的值: http://tempuri.org/HelloWorld/......省略。
请根据请求的本地webservice SOAP版本来设置值:
如果为SOAP 1.2的请求和响应示例 那么SoapEnvelope 也需要改 :12 如不行试试11或10; 另外一个报错:android.os.NetworkOnMainThreadException :是网络请求在MainThread中产生的异常 原因是在onCreate()方法中不能同时使用网络访问 搜索原因说,从Honeycomb SDK(3.0)开始,google不再允许网络请求(HTTP、Socket)等相关操作直接在Main Thread类中,其实本来就不应该这样做, 直接在UI线程进行网络操作,会阻塞UI、用户体验相当bad! 现在我的代码已解决这个问题,使之不用线程也可以调用,简单测试可以,如果拥于大项目请详细查询 我就不多说了。
相关文章推荐
- 自定义GridView的使用(盒子应用)
- 关于android内存管理
- Android实现仿网易首页选项卡动态滑动效果
- android 自定义下拉菜单
- Android应用Design Support Library完全使用实例
- Android资源,国内镜像站点,博客文章等
- android studio 编辑环境里的竖线如何隐藏去掉?
- Android中Strings.xml使用占位符示例
- Android 线程间通信
- Android Databinding 从入门到转行(四)自定义设置通知刷新回调
- Android游戏开发工程师
- Viewpager和PagerSlidingTabStrip的日常玩弄(使用)
- Android 热更新
- Android手动混淆打包(com.android.library类型工程项目打包jar包)
- Android双重单选对话框的制作与监听
- Android_Matrix
- 安卓项目之淘忆2.0的界面设计部分三
- Xamarin Android长度单位区别
- Xamarin Android长度单位区别
- Android 真实简历