Android学习记录(二)

本文介绍了Android开发中的实用技巧,包括实体类创建、网络状态检查、WebService调用、XML解析及SQLite数据库操作等内容。

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的具体类。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值