Android学习记录(二)
新建简单实体类格式
在eclipse中可以快速实现
public class logobj {
private String code;
private String name;
private String id;
public String getcode() {
return code;
}
public void setuCode(String code){
this.code=code;
}
public String getname() {
return name;
}
public void setuName(String name){
this.name=name;
}
public String getid() {
return id;
}
public void setdDeptId(String id){
this.id=id;
}
public String toString() {
// TODO Auto-generated constructor stub
return code+"^"+name+"^"+id;
}
}
实现如何在主线程联网
在Android API>9 (Honeycomb及之后)版本里,对UI线程/主线程里是不允许联网操作的,如果有网络操作,会抛出NetworkOnMainThreadException的异常。
解决方法一:
在onCreate方法中插入代码如下,同时在方方法前加上@SuppressLint(“NewApi”)
@Override
@SuppressLint("NewApi")
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.log);
StrictMode.ThreadPolicy policy=new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
解决方法二:
启动一个子线程来处理联网操作(推荐但目前不会)
判断网络是否连接
参考网址:http://erbo2008.iteye.com/blog/1779214
注意点:
在AndroidManifest中添加权限
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
不区分网络类型的连接判断代码如下:
public class NetCon {
public boolean isNetworkConnected(Context context) {
if (context != null) {
ConnectivityManager mConnectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo mNetworkInfo = mConnectivityManager.getActiveNetworkInfo();
if (mNetworkInfo != null) {
return mNetworkInfo.isAvailable();
}
}
return false;
}
}
其中Context是提供了关于应用环境全局信息的接口。通过它可以访问当前包的资源(getResources、getAssets)和启动其他组件(Activity、Service、Broadcast)以及得到各种服务(getSystemService)。
调用类方法代码如下:
NetCon netflag=new NetCon();
boolean reflag=netflag.isNetworkConnected(log.this);
if(reflag==false){
//Toast.makeText(log.this,"当前无网络连接" , Toast.LENGTH_LONG).show();
new AlertDialog.Builder(log.this).setTitle("系统提示").setMessage("当前无网络连接,请连接网络后重试").setPositiveButton("确定",null).show();}
如何调用WebService
什么是WebService
简单的说WebService就是是远程的某个服务器对外公开了某种服务,或者理解为对外公开了某个功能或者方法,而我们可以通过编程来调用该服务以获得我们需要的信息。
如何测试接口文档是否可连接
利用下面软件,添加WSDL文档
Storm_r1.1-Adarna.rar
调用WebService需要的文档
WSDL文档
WSDL(Web Services Description Language),即Web服务描述语言)是一种用来描述Web服务的XML语言,它描述了Web服务的功能、接口、参数、返回值等,便于用户绑定和调用服务。它以一种和具体语言无关的方式定义了给定Web服务调用和应答的相关操作和消息。
例子:http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl
<?xml version="1.0" encoding="utf-8" ?>
<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/"
xmlns:tns="http://WebXml.com.cn/"
xmlns:s="http://www.w3.org/2001/XMLSchema"
xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/"
xmlns:http="http://schemas.xmlsoap.org/wsdl/http/"
targetNamespace="http://WebXml.com.cn/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
<wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
<a href="http://www.webxml.com.cn/" mce_href="http://www.webxml.com.cn/" target="_blank">WebXml.com.cn</a>
<strong>国内手机号码归属地查询WEB服务</strong>,提供最新的国内手机号码段归属地数据,每月更新。<br />
使用本站 WEB 服务请注明或链接本站:<a href="http://www.webxml.com.cn/" mce_href="http://www.webxml.com.cn/" target="_blank">http://www.webxml.com.cn/
</a>感谢大家的支持!<br />
</wsdl:documentation>
<wsdl:types>
<s:schema elementFormDefault="qualified" targetNamespace="http://WebXml.com.cn/">
<s:element name="getMobileCodeInfo">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="mobileCode" type="s:string" />
<s:element minOccurs="0" maxOccurs="1" name="userID" type="s:string" />
</s:sequence>
</s:complexType>
</s:element>
<s:element name="getMobileCodeInfoResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="getMobileCodeInfoResult" type="s:string" />
</s:sequence>
</s:complexType>
</s:element>
... ...
</s:schema>
</wsdl:types>
... ...
</wsdl:definitions>
其中有用的参数如下:
| 内容 | 解释 |
|---|---|
| targetNamespace=”http://WebXml.com.cn/” | 命名空间为http://WebXml.com.cn/ |
| xmlns:soap12=”http://schemas.xmlsoap.org/wsdl/soap12/” | soap协议为soap12 |
| name=”getMobileCodeInfo” | 指明调用方法 |
| name=”mobileCode” type=”s:string” | 调用参数 |
SOAP协议
SOAP(Simple Object Access Protocol,简单对象访问协议)是一种轻量级的、简单的、基于XML的协议,被设计用于在分布式环境中交换格式化和固化信息的简单协议。也就是说,要进行通信,进行数据访问传输,就必须依赖于一定的协议,而SOAP正是WebService通信中所依赖的一种协议。
所使用jar包下载:ksoap2-android-assembly-3.3.0-jar-with-dependencies.jar
新建webservice类(可实现多个类中调用)
代码如下:
public class webservices {
private String requestcode;
private String requestxml;
public void setcode(String code){
this.requestcode=code;
}
public void setxml(String xml){
this.requestxml=xml;
}
public String getmesage() {
// TODO Auto-generated constructor stub
//设置命名空间
String nameSpace ="";
//设置调用方法
String methodName = "";
//设置WSDL文档位置但不包含?wsdl
String endPoint = "";
//设置方法完整路径,通常为SOAP Action通常为命名空间 + 调用的方法名称。
String soapAction = "";
//新建Soap对象
SoapObject rpc = new SoapObject(nameSpace, methodName);
//给对象添加参数
rpc.addProperty("RequestCode",this.requestcode);
rpc.addProperty("RequestXML", this.requestxml);
//新建请求包对象envelope,指定SOAP的版本
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER10);
//指定调用WebService方法的SOAP请求信息
envelope.bodyOut = rpc;
//设置是否调用的是dotNet开发的WebService
envelope.dotNet = true;
//等价于envelope.bodyOut = rpc;
envelope.setOutputSoapObject(rpc);
HttpTransportSE transport = new HttpTransportSE(endPoint);
try {
// 调用WebService
transport.call(soapAction, envelope);
} catch (Exception e) {
e.printStackTrace();
}
//将envelope的返回值对象化
SoapObject object = (SoapObject) envelope.bodyIn;
String result = object.getProperty(0).toString();
return result;
}
}
在Activity中调用上面的webservice类
webservices webobj=new webservices();
webobj.setcode("50101");
webobj.setxml(Requestxml);
String result=webobj.getmesage();
注意点:
- 在AndroidMainifest文件中添加访问网络权限
<activity
android:name=".pat"
android:label="@string/app_name" >
</activity>
</application>
<uses-permission android:name="android.permission.INTERNET" />
</manifest>
PULL解析XML字符串
分析的XML文件
<info><code>101</code><name>test1</name><id>201</id></info>
<info><code>102</code><name>test2</name><id>202</id></info>
<info><code>103</code><name>test3</name><id>203</id></info>
//log类为上述新建类
log=new logobj();
List<logobj> loglist=new ArrayList<logobj>();
//result为xml文件的字符串对象,新建字节输入流
ByteArrayInputStream tInputStringStream =new ByteArrayInputStream(result.getBytes());
//新建一个Pull解析器
XmlPullParser parser = Xml.newPullParser();
try {
//设置输入流和字符编码
parser.setInput(tInputStringStream, "UTF-8");
//新建int事件变量
int eventType = parser.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) {
switch (eventType) {
//判断文档是否开始
case XmlPullParser.START_DOCUMENT:
break;
//判断开始标签
case XmlPullParser.START_TAG:
if (parser.getName().equals("info")) {
}else if (parser.getName().equals("code")){
eventType = parser.next();
log.setcode(parser.getText());
}else if (parser.getName().equals("name")){
eventType = parser.next();
log.setname(parser.getText());
}else if (parser.getName().equals("id")){
eventType = parser.next();
log.setid(parser.getText());
} break;
//判断结尾标签
case XmlPullParser.END_TAG:
if (parser.getName().equals("info")) {
loglist.add(log);
log=new logobj();
break;
}
}
eventType = parser.next();
}
} catch (XmlPullParserException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
SQLite使用
摘要:轻量级、独立性、隔离性、跨平台、多语言接口、安全性:SQLite 数据库通过数据库级上的独占性和共享锁来实现独立事务处理。这意味着多个进程可以在同一时间从同一数据库读取数据,但只能有一个可以写入数据。
基本功能
默认支持类型:null,integer,real(浮点型),text(文本),blob(二进制数据)
//新建数据库user.db,第一个参数为数据库路径,MODE_PRIVATE表示数据库为私有数据库
SQLiteDatabase db=openOrCreateDatabase("user.db",MODE_PRIVATE,null);
//创建表usertable,括号里为普通SQL语句
db.execSQL("create table if not exists usertable(_id integer primary key autoincrement, code text not null,name text,id text)");
//以给定的格式获取系统时间
String date=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
//以字段名新建键值对
ContentValues values = new ContentValues();
values.put("code",log.getcode());
values.put("name",log.getname());
values.put("id",log.getid());
//插入数据到表,返回行号
//第二个参数含义:当values参数为空或者没有内容时,insert插入失败,设置值为null的列
db.insert("usertable",null,values);
//查询数据
//写入查询条件并获得游标,其中第二个参数为查询参数
//db.rawQuery("select * from usertable while id=?",new Stirng[]{"1"}
Cursor c = db.rawQuery("select * from usertable",null);
//将游标向下一行数据移动
while(c.moveToNext()){
String[] columns=c.getColumnNames();
for(String columnname:columns){ Log.i("taggg",columnname+":"+c.getString(c.getColumnIndex(columnname)));
}
}
//清理键值对和关闭数据库
values.clear();
db.close();
常用游标函数
| 方法名称 | 方法描述 |
|---|---|
| getCount() | 总记录条数 |
| isFirst() | 判断是否第一条记录 |
| isLast() | 判断是否最后一条记录 |
| moveToFirst() | 移动到第一条记录 |
| moveToLast() | 移动到最后一条记录 |
| move(int offset) | 移动到指定的记录 |
| moveToNext() | 移动到吓一条记录 |
| moveToPrevious() | 移动到上一条记录 |
| getColumnIndex(String columnName) | 获得指定列索引的int类型值 |
SimpleAdapter的使用(可实现List的自定义布局)
Java文件
//字符串数组和图片id数组
private String[] ltexts={"item1","item2","item3","item4","item5"};
private int[] limages={R.drawable.img1,R.drawable.img2,R.drawable.img3,R.drawable.img4,R.drawable.img5};
//以下代码写在onCreate方法中
//Map<String, Object>接受key为String,value为Object的类型的对象
List<Map<String, Object>> listems = new ArrayList<Map<String, Object>>();
for(int i=0;i<ltexts.length;i++){
//新建HashMap键值对
Map<String,Object> listitem=new HashMap<String,Object>();
listitem.put("limage", limages[i]);
listitem.put("ltext",ltexts[i]);
listems.add(listitem);
}
//SimpleAdapter(Context context, List<? extends Map<String, ?>> data, int resource, String[] from, int[] to)
//第一个参数为访问应用程序接口,通常为this
//第二个参数为Map列表,列表要显示的数据
//第三个参数为布局id
//第四个参数为键值对的keys
//第五个参数为布局中需要填充控件的id,与keys对应
SimpleAdapter simplead=new SimpleAdapter(this, listems, R.layout.mainlist, new String[]{ "limage", "ltext"}, new int[] {R.id.limage,R.id.ltext});
mainlist.setAdapter(simplead);
XML文件(mainlist.xml)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="90dp"
android:orientation="horizontal" >
<ImageView
android:id="@+id/limage"
android:layout_width="90dp"
android:layout_height="match_parent"/>
<TextView
android:id="@+id/ltext"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:textSize="25sp"
android:paddingLeft="20dp"
android:gravity="center_vertical"
android:textColor="#000"
/>
</LinearLayout>
其他
简单的对话框
new AlertDialog.Builder(log.this).setTitle("系统提示").setMessage("当前无网络连接,请连接网络后重试").setPositiveButton("确定",null).show();}
Java字符串操作函数
- Stringobj.indexOf(“str”)—获取str在字符串Stringobj第一次出现的位置
- Stringobj.substring(startof, endof)—截取从stratof到endof的字符串
- Stringobj.equalsIgnoreCase(“str”)—判断str与String是否相同
EditText的错误显示
et1.setError(“用户名不能为空”);
如何新建对象数组
final List<logobj> loglist=new ArrayList<logobj>();
其中List为接口,ArrayList为实现接口List的具体类。
本文介绍了Android开发中的实用技巧,包括实体类创建、网络状态检查、WebService调用、XML解析及SQLite数据库操作等内容。
&spm=1001.2101.3001.5002&articleId=50578378&d=1&t=3&u=1687b2b2473340f0b5d78a8da4ed6114)
781

被折叠的 条评论
为什么被折叠?



