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>

其中有用的参数如下:

内容 解释 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的具体类。

0 0
原创粉丝点击