Android学习记录(二)
来源:互联网 发布:js获取页面停留时间 编辑:程序博客网 时间:2024/06/05 02:44
Android学习记录(二)
- Android学习记录二
- 新建简单实体类格式
- 实现如何在主线程联网
- 判断网络是否连接
- 如何调用WebService
- 什么是WebService
- 如何测试接口文档是否可连接
- 调用WebService需要的文档
- SOAP协议
- 新建webservice类可实现多个类中调用
- 在Activity中调用上面的webservice类
- PULL解析XML字符串
- SQLite使用
- 基本功能
- 常用游标函数
- SimpleAdapter的使用可实现List的自定义布局
- Java文件
- XML文件mainlistxml
- 其他
- 简单的对话框
- Java字符串操作函数
- EditText的错误显示
- 如何新建对象数组
新建简单实体类格式
在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>
其中有用的参数如下:
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();
常用游标函数
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学习记录(二)
- Android学习记录(二)
- android学习记录(二)
- android学习记录<二>
- Android学习记录 计算器(二)
- 《Android群英传》学习记录(二)
- Android 开发学习记录(3)---- httpclient使用(二)
- Android 动画学习记录(二)---frame动画
- Android ClassLoader工作原理学习记录(二)
- AcegiSecurity学习记录(二)
- DB2学习记录(二)
- DB2学习记录(二)
- Magento 学习记录(二)
- perl学习记录(二)
- JS学习记录(二)
- django学习记录(二)
- Linux学习记录(二)
- Python 学习记录(二)
- 【区间型DP】石子归并问题
- 提高 Linux 上 socket 性能
- +load +initialize
- Java基础学习总结(28)——Java对各种排序算法的实现
- 动画学习 三
- Android学习记录(二)
- 如何正确遍历删除List中的元素
- 组件和布局加载~LayoutInflater和findViewById() 的区别
- 在android 6.0以上无法获取READ_PHONE_STATE权限的SecurityException的问题
- android开发中常用快捷键
- Ubuntu下编译安装 OpenCV 3.1
- ORA-01403:no data found 解决办法
- The import javax.servlet.http.HttpServletRequest cannot be resolved
- 关于Adapter的The content of the adapter has changed问题分析