android 怎样获取后台的数据?

android 怎样获取后台的数据?,第1张

可使用android自带的httpclient框架,向后台发起请求,获取数据。\x0d\x0a\x0d\x0a1. GET 方式传递参数\x0d\x0a//先将参数放入List,再对参数进行URL编码\x0d\x0aList params = new LinkedList()\x0d\x0aparams.add(new BasicNameValuePair("param1", "数据")) //增加参数1\x0d\x0aparams.add(new BasicNameValuePair("param2", "value2"))//增加参数2\x0d\x0aString param = URLEncodedUtils.format(params, "UTF-8")//对参数编码\x0d\x0aString baseUrl = "服务器接口完整URL"\x0d\x0aHttpGet getMethod = new HttpGet(baseUrl + "?" + param)//将URL与参数拼接\x0d\x0aHttpClient httpClient = new DefaultHttpClient()\x0d\x0atry {\x0d\x0aHttpResponse response = httpClient.execute(getMethod)//发起GET请求\x0d\x0aLog.i(TAG, "resCode = " + response.getStatusLine().getStatusCode())//获取响应码\x0d\x0aLog.i(TAG, "result = " + EntityUtils.toString(response.getEntity(), "utf-8"))//获取服务器响应内容\x0d\x0a} catch (ClientProtocolException e) {\x0d\x0ae.printStackTrace()\x0d\x0a} catch (IOException e) {\x0d\x0ae.printStackTrace()\x0d\x0a}\x0d\x0a\x0d\x0a2. POST方式 方式传递参数\x0d\x0a//和GET方式一样,先将参数放入List\x0d\x0aparams = new LinkedList()\x0d\x0aparams.add(new BasicNameValuePair("param1", "Post方法"))//增加参数1\x0d\x0aparams.add(new BasicNameValuePair("param2", "第二个参数"))//增加参数2\x0d\x0atry {\x0d\x0aHttpPost postMethod = new HttpPost(baseUrl)//创建一个post请求\x0d\x0apostMethod.setEntity(new UrlEncodedFormEntity(params, "utf-8"))//将参数填入POST Entity中\x0d\x0aHttpResponse response = httpClient.execute(postMethod)//执行POST方法\x0d\x0aLog.i(TAG, "resCode = " + response.getStatusLine().getStatusCode())//获取响应码\x0d\x0aLog.i(TAG, "result = " + EntityUtils.toString(response.getEntity(), "utf-8"))//获取响应内容\x0d\x0a} catch (UnsupportedEncodingException e) {\x0d\x0ae.printStackTrace()\x0d\x0a} catch (ClientProtocolException e) {\x0d\x0ae.printStackTrace()\x0d\x0a} catch (IOException e) {\x0d\x0ae.printStackTrace()\x0d\x0a}

每个应用程序都要使用数据,Android应用程序也不例外,Android使用开源的、与 *** 作系统无关的SQL数据库—SQLite。

SQLite第一个Alpha版本诞生于2000年5月,它是一款轻量级数据库,它的设计目标是嵌入式的,占用资源非常的低,只需要几百K的内存就够了。

SQLite已经被多种软件和产品使用,Mozilla FireFox就是使用SQLite来存储配置数据的,Android和iPhone都是使用SQLite来存储数据的。

SQLite体系结构图如下:

编译器包括Tokenizer(词法分析器)、 Parser(语法分析器)、Code Generator(代码产生器),后端由B-tree,Pager,OS Interface组成。

B-tree的职责是负责排序,维护多个数据库页之间错综复杂的关系,将页面组织成树状结构,页面就是树的叶子

Pager负责传输,根据B-tree的请求从磁盘读取页面或者写入页面。

公共服务中有各种实用的功能比如:内存分配、字符串比较,Unicode转换等。

想实现一个功能即让android访问远程数据库,但是网上很多人都不建议直连。据说问题多多。那么中间就加个第三者吧。

实现思路:在数据库和Android客户端添加一个webservice,处理每次客户端发来的请求。而在android客户端使用ksoap2解析webservice返回的数据。

一 webservice 端,我使用序列化的方式实现的。不知道这里跟xml的实现哪个对手机来说更好。这里先放下,以后研究。

1.我使用的是xfire。新建一个webservice项目,然后我们开始写代码

2.一个接口

Java代码

public interface ICompany {

public List<Company>getCompanyList()

}

3一个实现类

Java代码

public class ICompanyImp implements ICompany {

CompanyDAO comdao=new CompanyDAO()

//得到所有公司列表

public List<Company>getCompanyList() {

List<Company>list=new ArrayList<Company>()

try {

list=comdao.getCompanyList()

} catch (SQLException e) {

e.printStackTrace()

list=null

}

return list

}

}

注意: 我这里的返回值是list,不少webservice的基本类型,所以需要为它配置文件 接口+.aegis.xml

4 接口+.aegis.xml

Xml代码

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

<mappings>

<mapping>

<!--

<method name="getCollectionsRowCount">

<parameter index="0" componentType="java.lang.String"/>

</method>

-->

<!-- 返回的类型是Map的话,做法和List一样。但定义的类型,是Map中的Value部分 -->

<method name="getCompanyList">

<return-type componentType="bean.Company"/>

</method>

</mapping>

</mappings>

5.service.xml

Xml代码

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

<beans >

<service xmlns="http://xfire.codehaus.org/config/1.0"

xmlns:s="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

<name>MyService</name>

<serviceClass>main.service.ICompany</serviceClass>

<implementationClass>main.service.ICompanyImp</implementationClass>

<style mce_bogus="1">wrapped</style>

<use>literal</use>

<scope>application</scope>

<namespace>http://android.googlepages.com/</namespace>

</service>

</beans>

发布项目后,运行效果如图:

项目结构:

二 android客户端

因为ksoap2解析webservice得到的数据类似于以下:getCompanyListResponse{out=anyType{Company=anyType{company=安徽江淮汽车股份有限公司id=1}}}

1 解析类:MyWebServiceHelper

Java代码

public class MyWebServiceHelper {

// WSDL文档中的命名空间

private static final String targetNameSpace = "http://android.googlepages.com/"

// WSDL文档中的URL

private static final String WSDL = "http://192.168.1.144:8080/oilservice/services/MyService"

// 需要调用的方法名(获得Myervices中的helloWorld方法)

//需要调用的方法名(获得Myervices中的login方法)

private static final String getCompany="getCompanyList"

public List<Company> getCompanyList( ) {

List<Company>list=new ArrayList<Company>()

SoapObject request =new SoapObject(targetNameSpace,getCompany)

SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(

SoapEnvelope.VER11)

envelope.dotNet = false

envelope.setOutputSoapObject(request)

AndroidHttpTransport httpTranstation = new AndroidHttpTransport (WSDL)

try {

httpTranstation.call(targetNameSpace+getCompany, envelope)

SoapObject soapObject = (SoapObject) envelope.getResponse()

//如果获取的是个集合,就对它进行下面的 *** 作

if(soapObject.getName()=="anyType") {

//遍历Web Service获得的集合

for(int i=0i<soapObject.getPropertyCount()i++){

Company m=new Company()

//获取单条的数据

SoapObject soapChilds =(SoapObject)soapObject.getProperty(i)

//对单个的数据进行再次遍历,把它的每行数据读取出来

m.setId(Integer.parseInt(soapChilds.getProperty("id").toString()))

m.setCompany(soapChilds.getProperty("company").toString())

/*

//获取实体类的所有属性

Field[] field = m.getClass().getDeclaredFields()

//遍历所有属性,第一个是序列化的id,serialVersionUID,用不到。

for(int j=0 j<field.length j++){

//获取属性的名字

String name = field[j].getName()

System.out.println(name)

}*/

// }

list.add(m)

}

}

} catch (IOException e) {

e.printStackTrace()

} catch (XmlPullParserException e) {

e.printStackTrace()

}

return list

}

}

2 实现类:

Java代码

public class OilActivity extends Activity {

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState)

setContentView(R.layout.main)

Spinner spinner = (Spinner) findViewById(R.id.company)

ArrayAdapter<String> adapter = new ArrayAdapter<String>(

this,android.R.layout.simple_spinner_item)

adapter.setDropDownViewResource(

android.R.layout.simple_spinner_dropdown_item)

//调用自已写的webService

MyWebServiceHelper webServiceHelper=new MyWebServiceHelper()

List<Company>compnayList= webServiceHelper.getCompanyList()

for(int i=0i<compnayList.size()i++){

adapter.add(compnayList.get(i).getCompany())

}

spinner.setAdapter(adapter)

}

}

3 两个项目中都用到的bean

Java代码

public class Company implements Serializable{

private static final long serialVersionUID = 1L

private int id

private String company

public int getId() {

return id

}

public void setId(int id) {

this.id = id

}

public String getCompany() {

return company

}

public void setCompany(String company) {

this.company = company

}

}

最后测试以下,list返回正确。效果图:

3项目结构:

参考文章:

http://ksoap2.sourceforge.net/doc/api/ ksoap2的API

http://topic.csdn.net/u/20110412/16/0341626d-8576-4dda-b9e4-aab3ff50c980.html 关于list处理的帖子

http://blog.csdn.net/haha_mingg/article/details/6338332,总的思路的实现。在此感谢作者的无私奉献

android 初学,愿与大家相互交流。共同进步。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9560268.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-29
下一篇 2023-04-29

发表评论

登录后才能评论

评论列表(0条)

保存