某些情况下我们可能需要与Mysql或者Oracle数据库进行数据交互,有些朋友的第一反应就是直接在Android中加载驱动然后进行数据的增删改查。我个人不推荐这种做法,一是手机毕竟不是电脑,操作大量数据费时费电;二是流量贵如金那。我个人比较推荐的做法是使用Java或PHP等开发接口或者编写WebService进行数据库的增删该查,然后Android调用接口或者WebService进行数据的交互。本文就给大家讲解在Android中如何调用远程服务器端提供的WebService。

既然是调用WebService,我们首先的搭建WebService服务器。

下面演示的就是如何通过该网站提供的手机号码归属地查询WebService服务查询号码归属地

调用地址http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx?op=getMobileCodeInfo。

首先,将请求消息保存在XML文件中,然后使用$替换请求参数,如下:

mobilesoap.xml

<?xml version="1.0" encoding="utf-8"?>          $mobile          

  其次,设计MainActivity布局文件,
main.xml

<?xml version="1.0" encoding="utf-8"?>          

 下面贴出MainActivity,

在Android中调用WebService还是比较简单的:请求webservice,获取服务响应的数据,解析后并显示。

package com.szy.webservice;   import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL; import java.util.HashMap; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern;   import org.xmlpull.v1.XmlPullParser;   import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.util.Xml; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast;   /**  * @author coolszy  * @date 2012-3-8  * @blog http://blog.92coding.com  */ public class MainActivity extends Activity {   private EditText mobileNum;   private TextView mobileAddress;   private static final String TAG = "MainActivity";     @Override   public void onCreate(Bundle savedInstanceState)   {     super.onCreate(savedInstanceState);     setContentView(R.layout.main);       mobileNum = (EditText) this.findViewById(R.id.mobileNum);     mobileAddress = (TextView) this.findViewById(R.id.mobileAddress);     Button btnSearch = (Button) this.findViewById(R.id.btnSearch);     btnSearch.setOnClickListener(new View.OnClickListener()     {       @Override       public void onClick(View v)       {         // 获取电话号码         String mobile = mobileNum.getText().toString();         // 读取xml文件         InputStream inStream = this.getClass().getClassLoader().getResourceAsStream("mobilesoap.xml");         try         {           // 显示电话号码地理位置,该段代码不合理,仅供参考           mobileAddress.setText(getMobileAddress(inStream, mobile));         } catch (Exception e)         {           Log.e(TAG, e.toString());           Toast.makeText(MainActivity.this, "查询失败", 1).show();         }       }     });   }     /**    * 获取电话号码地理位置    *    * @param inStream    * @param mobile    * @return    * @throws Exception    */   private String getMobileAddress(InputStream inStream, String mobile) throws Exception   {     // 替换xml文件中的电话号码     String soap = readSoapFile(inStream, mobile);     byte[] data = soap.getBytes();     // 提交Post请求     URL url = new URL("http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx");     HttpURLConnection conn = (HttpURLConnection) url.openConnection();     conn.setRequestMethod("POST");     conn.setConnectTimeout(5 * 1000);     conn.setDoOutput(true);     conn.setRequestProperty("Content-Type", "application/soap+xml; charset=utf-8");     conn.setRequestProperty("Content-Length", String.valueOf(data.length));     OutputStream outStream = conn.getOutputStream();     outStream.write(data);     outStream.flush();     outStream.close();     if (conn.getResponseCode() == 200)     {       // 解析返回信息       return parseResponseXML(conn.getInputStream());     }     return "Error";   }     private String readSoapFile(InputStream inStream, String mobile) throws Exception   {     // 从流中获取文件信息     byte[] data = readInputStream(inStream);     String soapxml = new String(data);     // 占位符参数     Map params = new HashMap();     params.put("mobile", mobile);     // 替换文件中占位符     return replace(soapxml, params);   }     /**    * 读取流信息    *    * @param inputStream    * @return    * @throws Exception    */   private byte[] readInputStream(InputStream inputStream) throws Exception   {     byte[] buffer = new byte[1024];     int len = -1;     ByteArrayOutputStream outSteam = new ByteArrayOutputStream();     while ((len = inputStream.read(buffer)) != -1)     {       outSteam.write(buffer, 0, len);     }     outSteam.close();     inputStream.close();     return outSteam.toByteArray();   }     /**    * 替换文件中占位符    *    * @param xml    * @param params    * @return    * @throws Exception    */   private String replace(String xml, Map params) throws Exception   {     String result = xml;     if (params != null && !params.isEmpty())     {       for (Map.Entry entry : params.entrySet())       {         String name = "\\$" + entry.getKey();         Pattern pattern = Pattern.compile(name);         Matcher matcher = pattern.matcher(result);         if (matcher.find())         {           result = matcher.replaceAll(entry.getValue());         }       }     }     return result;   }     /**    * 解析XML文件    * @param inStream    * @return    * @throws Exception    */   private static String parseResponseXML(InputStream inStream) throws Exception   {     XmlPullParser parser = Xml.newPullParser();     parser.setInput(inStream, "UTF-8");     int eventType = parser.getEventType();// 产生第一个事件     while (eventType != XmlPullParser.END_DOCUMENT)     {       // 只要不是文档结束事件       switch (eventType)       {       case XmlPullParser.START_TAG:         String name = parser.getName();// 获取解析器当前指向的元素的名称         if ("getMobileCodeInfoResult".equals(name))         {           return parser.nextText();         }         break;       }       eventType = parser.next();     }     return null;   } } 

最后注意,由于需要访问网络,需要加上权限

 

通过上面简单的例子,相信大家已经学习了如何在Android中调用WebService,最后运行效果:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

更多相关文章

  1. 配置vim开发Android[神器终究是神器]
  2. Android面试题(28)-android的view加载和绘制流程
  3. Android(安卓)apk系列2-------系统签名(生成release版本的系统)
  4. Android同步类:Mutex和Condition
  5. 【Android(安卓)ApkTool 反编译获取源码】下载一个apk,然后获取
  6. IDA 调试 Android(安卓)方法及简单的脱壳实现
  7. Android(安卓)ANR问题原因分析
  8. Android应用开发之(让你的应用向后兼容)
  9. DEX 文件和APK 加载

随机推荐

  1. 【Android】Android(安卓)Studio 查找工
  2. Android小部件布局大小和点击事件
  3. Android使用百度推送实现即时通讯的功能
  4. Qt for Android(安卓)集成史上第一最全最
  5. 基于 Android(安卓)NDK 的学习之旅-----J
  6. Android(安卓)Architecture Blueprints(架
  7. Android中的.9.png图形的机制及制作和使
  8. android HOME、back(按钮、事件)截取获得,综
  9. 【凯子哥带你夯实应用层】Android的Googl
  10. Android(安卓)So加载的路径选择以及注意