本人是。NET出身 但苦于领导要让研究Android 外壳而后准备套html5 ,当试验兵真坑啊 但也没办法 咱还得研究啊,索性 不辜负领导的指望(也研究好两三天了)总算弄明白了 app本地存储 和 Android Studio 调用 Webservice 了,中间出现了好几处问题 ,本身也百度了很久 都没有解决个人问题,且它们那些答案都是复制粘贴下根本就没有测试可不能够 就贴出来了 这我就很气愤啊 下面为了给和我同样的新手和想研究的各位一点便利,把本身遇到的问题与如何解决分享下 以便本身也加深印象。html
若有不对了还请不要喷 请@我呦!html5
1.首先本人作的也是简单webserivce且能调试通就能够,因此新建了一个空网站:java
名字能够随便取的啦。android
2.最好在创建一个web窗体,这样你在发布的时候就有个初始的页面了,不至于没有初始页面。git
里面文字随便写下:初始Indexgithub
3.新建一个WebService 服务:便于测试 随便返回几个文字就好:web
以上就是C# VS webservice的建立了,下面才是重头戏:Android Studio开始服务器
在写代码以前须要下载并导入jar 工具类包。网络
Google为Android平台开发Web Service客户端提供了ksoap2-android项目,但这个项目并未直接集成在Android平台中,还须要开发人员自行下载。为Android应用增长ksoap2-android运行请按以下步骤进行:app
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!
如今个人代码已解决这个问题,使之不用线程也能够调用,简单测试能够,若是拥于大项目请详细查询 我就很少说了。