android webService 异步访问

 android 使用webservices 需要注意几个问题,这也是我在项目中遇到的,总结一下,和大家分享

1.在AndoirdManifest.xml添加网络访问权限。

2.android访问webServices的代码编写。

3.android使用webService的代码不能放在主线程(uI)线程。如果必须要放在主线程可以使用StrictMode。下面具体说明。

4.android使用webService放在后台现场执行的方法。

5.需要线程返回值的方法。

下面对上面的问题加以说明

1.在AndroidManifest.xml添加

 <uses-permission android:name="android.permission.INTERNET" />

 

2.android使用webServices需要使用第三方jar。我在项目中使用的是通用的ksoap2 (具体文件名为:ksoap2-android-assembly-2.5.4-jar-with-dependencies.jar)

 请求服务的时候,在ksoap2中最低需要三个参数。

  1) 请求服务的Url

  2) 服务的命名空间

  3) 服务的方法名称

 一般来说知道Url之后,通过分析wsdl可以知道2,3 两个参数。

  构造请求服务的代码块如下:

 

	public String requestServer(String uId) {	
	 try {		 
			SoapObject rpc = new SoapObject(http://tempuri.org/, getDeviceId());//getDeviceId是调用服务的方法名称			
			rpc.addProperty("deviceid", uId);	//设置请求参数
			SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
			envelope.bodyOut = rpc;
			envelope.dotNet = true;
			envelope.setOutputSoapObject(rpc);
			
			HttpTransportSE ht = new HttpTransportSE(WEBSERVICE_URL,5000); //WEBSERVICE_URL是请求webServices的url
			ht.debug = true;				
			ht.call(SOAP_ACTION, envelope);		
			Object obj = (Object)envelope.getResponse();
			
			if(obj !=null){
				return obj.toString();
			}	
			return "" ;
		 }catch (IOException e) {				
			e.printStackTrace();
		 } return ""; }}

上面的这段代码就是请求webservices 的代码。在我本机中是可以用的代码。

3 如果把这个段代码放在onCreate方法内部执行,初始化请求数据的时候,系统肯定报错。打印异常。这是因为,像请求网络这种费时操作不能放在主线程执行。但是如果必须放在主线程执行可以使用StrictMode

具体方法如下:

在onCreate方法开始处添加如下代码: 

 

try{

        int applicationFlags = this.getApplicationInfo().flags;
        if ((applicationFlags & ApplicationInfo.FLAG_DEBUGGABLE) != 0) {
            StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
                .detectDiskReads()
                .detectDiskWrites()
                .detectNetwork()
                .penaltyLog()
                .build());
            StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
                .detectLeakedSqlLiteObjects()
                .penaltyLog()
                .penaltyDeath()
                .build());
        }}catch (Throwable throwable) {    Log.v("StrictMode", "... is not available. Punting...");   }//添加异常捕获是因为在android低版本是不支持StricMode的。


添加完这段代码之后,在主线程内部运行请求webservices代码,就不会出错了。但是在具体的项目,比较好的做法,还是使用多线程。就是将费时的操作,单独放在一个线程内部执行。

我的实现思路是:

1.发个消息。

2.handler接受消息后,启动线程,执行请求webServices操作

具体实现的代码如下:

 

  Message msg = handler.obtainMessage();
  msg.what = 111; //具体数值可以自己任意设置。我再次随便设置111
  handler.sendMessageDelayed(msg,500)

 

处理消息的handler代码:

public Handler handler = new Handler() {

		@Override
		public void handleMessage(Message msg) {
			
			if(msg.what==111)							
				
			WebServicesTask task =  new WebServicesTask();
		         String result = "";
		 try {
			task.execute("idxxx"); //设置请求参数 
			result = task.get(5000, TimeUnit.MILLISECONDS); //获取返回值,设置超时时间。
		     }catch (InterruptedException e) {   
     			 e.printStackTrace();
     			 result= "";
    		    } catch (ExecutionException e) {   
       			 e.printStackTrace();
       			 result= "";
   		    } catch (TimeoutException e) {
       			e.printStackTrace();
    			result= "";
  		    }
		}
}




 WebServicesTask类是一个AsyncTask ,之所以用Task有两个原因

1.异步操作(后台)。

2.线程操作完毕之后,返回值。

 

WebServicesTask类的代码如下:

public class WebServicesTask extends AsyncTask<String,Integer,String>{
	private Context mContext ;	

	
	public WebServicesTask(){
		//nothing to do
	}

	@Override
	protected void onPreExecute(){
		//nothing to do	
	}
	
	@Override
	protected String doInBackground(String... params) {		
		return requestServer(params[0]) ;//返回webServices请求的值。
	}
    
	@Override
	protected void onProgressUpdate(Integer... progress) {
		//nothing to do        
	}
	
	@Override
	protected void onPostExecute(String result) {
		//nothing to do
	}
}


 


至此android请求webServices,异步操作,现场返回,介绍完毕。代码部分是我自己手动输入的。如果有任何错误,请留言指出,希望大家共同讨论。相互学习。谢谢!!!

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值