zoukankan      html  css  js  c++  java
  • 使用Android Studio开发调用.NET Webservice 之初体验

    本人是。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) 

    1.1

     此时最新为3.6.1,我下载的是3.3.0。 

    1.1.1

    1.2 切换到Project面板

      1.2.1

      将ksoap2JAR包直接复制粘贴到app->libs目录下 

      1.2.2

      右键Add as Library…,弹出对话框,OK就行了。

      1.2.3

     

    <?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接口需要传入的两个参数mobileCodeuserId
    //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!
    现在我的代码已解决这个问题,使之不用线程也可以调用,简单测试可以,如果拥于大项目请详细查询 我就不多说了。

    
    
    
    
    
    
  • 相关阅读:
    php 解析json
    TP学习笔记一(tp的目录结构 , tp的输出方式)
    linux android真机测试
    SharedPreferences保存数据
    Volley用法
    android获得图片
    android 一条线
    android 获取时间
    Android_Spinner_Listener
    Android_Spinner_SimpleAdapter
  • 原文地址:https://www.cnblogs.com/bruceli-net/p/5688216.html
Copyright © 2011-2022 走看看