单元测试+内存、SD卡、SP读写+XmlPullParser

 

测试:

  • 测试的相关概念

1、根据是否知道源代码分类:

黑盒测试: a - b - c 边值测试 测试逻辑业务
白盒测试: 根据源代码写测试方法 或者 测试用例;

2、根据测试的粒度分类:

方法测试:写完一个方法后就测试
单元测试:测试一个能够独立运行的业务逻辑单元;
集成测试:整体测试项目 联调
系统测试:对整个系统进行测试

3、根据测试的暴力程度:

冒烟测试:高频次的点击软件
压力测试:使用测试工具:LoadRunnerJmeter


单元测试Junit:

 

  • eclipse中的单元测试步骤:

1、写一个业务类,写一个业务方法:

public class CalcService {

  public static int add(int x,int y){

  return x+y;
}

}

2、写一个测试类,写一个测试方法,用来测试业务方法

public class CalcServiceTest extends AndroidTestCase{

  public void testAdd(){
    int result = CalcService.add(4, 5);
    assertEquals(9, result);//断言的作用:检测运行结果和预期是否一致
  }

}
3、在清单文件中添加测试需要的包

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="com.itheima.junit"
  android:versionCode="1"
  android:versionName="1.0" >


<!-- 添加指令集,添加到manifest节点的里面,指令集会把应用程序部署到模拟器上运行 -->

<instrumentation android:name="android.test.InstrumentationTestRunner" android:targetPackage="com.itheima.junit"></instrumentation>

<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >

<!-- 添加JUnit的测试包 ,添加到application节点的里面-->

<uses-library android:name="android.test.runner"/>

....
</application>

</manifest>

  • Android studio中单元测试步骤:(注意在AS中跟在eclipse中单元测试大有区别:省去了在清单文件中很多配置:指定指令集和要测试的应用包名,定义要使用的类库。因为AS内部集成了单元测试

  1、创建一个业务类,一个业务方法

 1 package com.ahu.androidtest;
 2 
 3 /**
 4  * Created by ahu_lichang on 2017/3/17.
 5  */
 6 
 7 public class Utils {
 8     public static int add(int i,int j){
 9         return i+j;
10     }
11 }

 

  2、选中上面的业务类Utils,右键-->Go To  ---->Test---->新建测试类(勾选上下面方框中的方法)--->OK

  3、在生成的测试类UtilsTest中,边写自己想要的测试代码(背影部分代码是自己手动写的!)

 1 package com.ahu.androidtest;
 2 
 3 import org.junit.Test;
 4 
 5 import static org.junit.Assert.*;
 6 
 7 /**
 8  * Created by ahu_lichang on 2017/3/17.
 9  */
10 public class UtilsTest {
11     @Test
12     public void add() throws Exception {
13         System.out.println("单元测试。。。");
14         int result = Utils.add(4,5);
15         assertEquals(9,result);//断言:检测预期的结果和运行的结果是否一致
16     }
17 
18 }

 

  4、最后右键测试类,运行这个类即可。

  5、运行结果


  • 把数据存储到文件

Android应用程序存储数据的方式:

1、保存到文件
2、SQLite数据库
3、内容提供者ContentProvider
4、sharedproferrences保存数据
5、网络

    /data/data/应用包名/info.txt

  • 从内存中读写文件(先把数据写入内存文件中,在从内存文件中读取数据并显示到界面上)

1、创建一个文件,目录data/data/<包名>/文件名eclipse中和AS中的内存文件的存储目录一样
2、创建一个文件输出流,把数据写到文件上
3、关闭输出流。

4、读取文件中的数据,并显示到界面上

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     xmlns:tools="http://schemas.android.com/tools"
 4     android:id="@+id/activity_main"
 5     android:layout_width="match_parent"
 6     android:layout_height="match_parent"
 7     android:paddingBottom="@dimen/activity_vertical_margin"
 8     android:paddingLeft="@dimen/activity_horizontal_margin"
 9     android:paddingRight="@dimen/activity_horizontal_margin"
10     android:paddingTop="@dimen/activity_vertical_margin"
11     tools:context="com.example.ahu_lichang.myapplication.MainActivity"
12     android:orientation="vertical"
13     >
14 
15     <EditText
16         android:id="@+id/et_name"
17         android:layout_width="match_parent"
18         android:layout_height="wrap_content"
19         android:hint="请输入用户名"
20         />
21     <EditText
22         android:id="@+id/et_pass"
23         android:layout_width="match_parent"
24         android:layout_height="wrap_content"
25         android:inputType="textPassword"
26         android:hint="请输入密码"
27         />
28     <RelativeLayout
29         android:layout_width="match_parent"
30         android:layout_height="wrap_content"
31         android:orientation="horizontal"
32         >
33         <CheckBox
34             android:id="@+id/cb"
35             android:layout_width="wrap_content"
36             android:layout_height="wrap_content"
37             android:text="记住用户名和密码"
38             android:layout_centerVertical="true"
39             />
40         <Button
41             android:layout_width="wrap_content"
42             android:layout_height="wrap_content"
43             android:layout_gravity="right"
44             android:text="登录"
45             android:layout_alignParentRight="true"
46             android:onClick="login"
47             />
48     </RelativeLayout>
49 
50 </LinearLayout>
 1 package com.example.ahu_lichang.myapplication;
 2 
 3 import android.os.Bundle;
 4 import android.support.v7.app.AppCompatActivity;
 5 import android.view.View;
 6 import android.widget.CheckBox;
 7 import android.widget.EditText;
 8 import android.widget.Toast;
 9 
10 import java.io.BufferedReader;
11 import java.io.File;
12 import java.io.FileInputStream;
13 import java.io.FileOutputStream;
14 import java.io.InputStreamReader;
15 /**
16  * 在内存中读写文件中数据
17  */
18 public class MainActivity extends AppCompatActivity {
19     private EditText et_name;
20     private EditText et_pass;
21     @Override
22     protected void onCreate(Bundle savedInstanceState) {
23         super.onCreate(savedInstanceState);
24         setContentView(R.layout.activity_main);
25 
26         et_name = (EditText) findViewById(R.id.et_name);
27         et_pass = (EditText) findViewById(R.id.et_pass);
28 
29         readAccount();
30 
31     }
32 
33     /**
34      * 从内存文件中读取数据
35      */
36     public void readAccount(){
37         File file = new File("data/data/com.example.ahu_lichang.myapplication/info.txt");//Tools->ADM->DDMS,在里面的文件浏览里能找到
38         if(file.exists()){
39             try {
40                 FileInputStream fis = new FileInputStream(file);
41                 //把字节流转换成字符流
42                 BufferedReader br = new BufferedReader(new InputStreamReader(fis));
43                 //读取txt文件里的用户名和密码
44                 String text = br.readLine();
45                 String[] s = text.split("##");
46 
47                 et_name.setText(s[0]);
48                 et_pass.setText(s[1]);
49             } catch (Exception e) {
50                 e.printStackTrace();
51             }
52         }
53     }
54     /**
55      * 先登录,将name和pass保存在内存中
56      */
57     public void login(View v){
58 
59         String name = et_name.getText().toString();
60         String pass = et_pass.getText().toString();
61 
62         CheckBox cb = (CheckBox) findViewById(R.id.cb);
63         //判断选框是否被勾选
64         if(cb.isChecked()){
65             //data/data/com.ahu.androidtest:这就是内部存储空间的路径
66             File file = new File("data/data/com.example.ahu_lichang.myapplication/info.txt");
67             FileOutputStream fos;
68             try {
69                 fos = new FileOutputStream(file);
70                 fos.write((name + "##" + pass).getBytes());
71                 fos.close();
72             } catch (Exception e) {
73                 e.printStackTrace();
74             }
75         }
76 
77         //创建并显示吐司对话框
78         Toast.makeText(this, "登录成功", 0).show();
79     }
80 }

 

读写SD卡中的文件(重点—Android studio实现

    注意:SD卡路径变化:

      • sdcard:2.3之前的
      • mnt/sdcard:4.3之前的
      • storage/sdcard:4.3之后的        

 

1、必须先要创建虚拟SD卡文件镜像,然后添加到AVD中(或者用命令让指定模拟器在启动时增加虚拟SD卡镜像文件)

1)、在Android studio使用mksdcard命令创建SD卡镜像文件:

  adb shell

  mksdcard 64M D:\sdcard.img    -----在D:\目录下创建了一个64M大小的虚拟SD卡

2)、将SD卡镜像文件添加到模拟器中:

  第一种方式:直接在创建AVD的时候,就想已有的SD卡镜像文件添加到模拟器中

  第二种方式:使用命令让指定模拟器在启动时就添加SD卡镜像文件     emulator -avd AVD5.1 -sdcard D:\sdcard.img

  2、在SD卡上先写入文件,然后在读取里面的数据显示在界面上

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     xmlns:tools="http://schemas.android.com/tools"
 4     android:id="@+id/activity_main"
 5     android:layout_width="match_parent"
 6     android:layout_height="match_parent"
 7     android:paddingBottom="@dimen/activity_vertical_margin"
 8     android:paddingLeft="@dimen/activity_horizontal_margin"
 9     android:paddingRight="@dimen/activity_horizontal_margin"
10     android:paddingTop="@dimen/activity_vertical_margin"
11     tools:context="com.example.ahu_lichang.myapplication.MainActivity"
12     android:orientation="vertical"
13     >
14 
15     <EditText
16         android:id="@+id/et_name"
17         android:layout_width="match_parent"
18         android:layout_height="wrap_content"
19         android:hint="请输入用户名"
20         />
21     <EditText
22         android:id="@+id/et_pass"
23         android:layout_width="match_parent"
24         android:layout_height="wrap_content"
25         android:inputType="textPassword"
26         android:hint="请输入密码"
27         />
28     <RelativeLayout
29         android:layout_width="match_parent"
30         android:layout_height="wrap_content"
31         android:orientation="horizontal"
32         >
33         <CheckBox
34             android:id="@+id/cb"
35             android:layout_width="wrap_content"
36             android:layout_height="wrap_content"
37             android:text="记住用户名和密码"
38             android:layout_centerVertical="true"
39             />
40         <Button
41             android:layout_width="wrap_content"
42             android:layout_height="wrap_content"
43             android:layout_gravity="right"
44             android:text="登录"
45             android:layout_alignParentRight="true"
46             android:onClick="login"
47             />
48     </RelativeLayout>
49 
50 </LinearLayout>
View Code
 1 package com.example.ahu_lichang.myapplication;
 2 
 3 import android.os.Bundle;
 4 import android.os.Environment;
 5 import android.support.v7.app.AppCompatActivity;
 6 import android.view.View;
 7 import android.widget.CheckBox;
 8 import android.widget.EditText;
 9 import android.widget.Toast;
10 
11 import java.io.BufferedReader;
12 import java.io.File;
13 import java.io.FileInputStream;
14 import java.io.FileOutputStream;
15 import java.io.InputStreamReader;
16 /**
17  * 在外部存储(SD卡)中读写文件中数据
18  */
19 public class MainActivity extends AppCompatActivity {
20     private EditText et_name;
21     private EditText et_pass;
22     @Override
23     protected void onCreate(Bundle savedInstanceState) {
24         super.onCreate(savedInstanceState);
25         setContentView(R.layout.activity_main);
26 
27         et_name = (EditText) findViewById(R.id.et_name);
28         et_pass = (EditText) findViewById(R.id.et_pass);
29 
30         readAccount();
31 
32     }
33 
34     /**
35      * 从SD卡文件中读取数据
36      */
37     public void readAccount(){
38         if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
39             File file = new File("storage/sdcard/info.txt");
40             if(file.exists()){
41                 try {
42                     FileInputStream fis = new FileInputStream(file);
43                     //把字节流转换成字符流
44                     BufferedReader br = new BufferedReader(new InputStreamReader(fis));
45                     String text = br.readLine();
46                     String[] s = text.split("##");
47                     et_name.setText(s[0]);
48                     et_pass.setText(s[1]);
49                 } catch (Exception e) {
50                     e.printStackTrace();
51                 }
52             }
53         }
54     }
55     /**
56      * 先登录,将name和pass保存在SD卡中
57      */
58     public void login(View v){
59 
60         String name = et_name.getText().toString();
61         String pass = et_pass.getText().toString();
62 
63         CheckBox cb = (CheckBox) findViewById(R.id.cb);
64         //判断选框是否被勾选
65         if(cb.isChecked()){
66             //MEDIA_UNKNOWN:不能识别sd卡
67             //MEDIA_REMOVED:没有sd卡
68             //MEDIA_UNMOUNTED:sd卡存在但是没有挂载
69             //MEDIA_CHECKING:sd卡正在准备
70             //MEDIA_MOUNTED:sd卡已经挂载,可用
71             if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){//判断SD卡状态是否挂载
72                 File file = new File(Environment.getExternalStorageDirectory(),"info.txt");//SD卡路径
73                 FileOutputStream fos;
74                 try {
75                     fos = new FileOutputStream(file);
76                     fos.write((name+"##"+pass).getBytes());
77                     fos.close();
78                     //创建并显示吐司对话框
79                     Toast.makeText(this, "登录成功", 0).show();
80                 } catch (Exception e) {
81                     e.printStackTrace();
82                 }
83             }else{
84                 Toast.makeText(this, "SD卡不可用!!!",0).show();
85             }
86         }
87     }
88 }
View Code

  3、添加权限:(在Android studio中读写SD卡上文件要添加创建与删除文件权限、写入数据权限,不需要读权限。eclipse中则是要添加读权限、写权限

1     <!--在SD卡中创建与删除文件权限-->
2     <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
3     <!--向SD卡写入数据权限-->
4     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
View Code

 

  • 获取SD的大小及可用空间
 1     /**
 2      * 获取SD卡空间大小
 3      */
 4     public void readSDSpace(){
 5         //获取sd卡的目录对象
 6         File file = Environment.getExternalStorageDirectory();
 7         //获取sd卡的总的大小
 8         Long total = file.getTotalSpace();
 9         //获取sd卡剩余空间的大小
10         Long use = file.getUsableSpace();
11         //打开DDMS,可以在LogCat观察到
12         Log.e("总的大小:",total.toString());
13         Log.e("剩余空间:",use.toString());
14         //转换数据大小的数据单位
15         String totalSize = android.text.format.Formatter.formatFileSize(this,total);
16         String useSize = android.text.format.Formatter.formatFileSize(this,use);
17         Log.e("格式化后总的大小:",totalSize);
18         Log.e("格式化后剩余空间:",useSize);
19     }
View Code

 

 

 

 

  • 文件的权限概念

文件的4种操作模式:
Context.MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容,如果想把新写入的内容追加到原文件中。可以使用Context.MODE_APPEND

Context.MODE_APPEND:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件

Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE用来控制其他应用是否有权限读写该文件。

MODE_WORLD_READABLE:表示当前文件可以被其他应用读取;MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入。


如果希望文件被其他应用读和写,可以传入:
openFileOutput("itcast.txt", Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE);

android有一套自己的安全模型,当应用程序(.apk)在安装时系统就会分配给他一个userid,当该应用要去访问其他资源比如文件的时候,就需要userid匹配。默认情况下,任何应用创建的文件,sharedpreferences,数据库都应该是私有的(位于/data/data/<package name>/files),其他程序无法访问。除非在创建时指定了Context.MODE_WORLD_READABLE或者Context.MODE_WORLD_WRITEABLE ,只有这样其他程序才能正确访问。

 

  • SharedPreferences存储方式(重点)

     在SharedPreferences中文件读写数据:

 1 package com.example.ahu_lichang.myapplication;
 2 
 3 import android.content.SharedPreferences;
 4 import android.os.Bundle;
 5 import android.support.v7.app.AppCompatActivity;
 6 import android.view.View;
 7 import android.widget.CheckBox;
 8 import android.widget.EditText;
 9 import android.widget.Toast;
10 
11 public class MainActivity extends AppCompatActivity {
12     private EditText et_name;
13     private EditText et_pass;
14     @Override
15     protected void onCreate(Bundle savedInstanceState) {
16         super.onCreate(savedInstanceState);
17         setContentView(R.layout.activity_main);
18 
19         et_name = (EditText) findViewById(R.id.et_name);
20         et_pass = (EditText) findViewById(R.id.et_pass);
21 
22         readAccount();
23     }
24 
25     public void readAccount(){
26         /**
27          * 从SharedPreferences中读取数据
28          */
29         SharedPreferences sp = getSharedPreferences("config",MODE_PRIVATE);
30         String name = sp.getString("name","");
31         String pass = sp.getString("pass","");
32         et_name.setText(name);
33         et_pass.setText(pass);
34     }
35 
36     public void login(View v){
37 
38         String name = et_name.getText().toString();
39         String pass = et_pass.getText().toString();
40 
41         CheckBox cb = (CheckBox) findViewById(R.id.cb);
42         //判断选框是否被勾选
43         if(cb.isChecked()){
44             /**
45              * 向SharedPreferences中写入数据.路径在data/data/包名/share_prefs
46              */
47             SharedPreferences sp = getSharedPreferences("config",MODE_PRIVATE);
48             SharedPreferences.Editor editor = sp.edit();
49             editor.putString("name",name);//键值对形式
50             editor.putString("pass",pass);
51             editor.commit();
52         }
53         Toast.makeText(this,"登录成功",0).show();
54     }
55 }
View Code

 

  • 使用StringBuffer拼接字符串完成短信备份
 1 package com.ahu.lichang.androidtest;
 2 
 3 /**
 4  * Created by ahu_lichang on 2017/3/18.
 5  */
 6 
 7 public class Message {
 8     private String body;
 9     private String date;
10     private String address;
11     private String type;
12     public String getBody() {
13         return body;
14     }
15     public void setBody(String body) {
16         this.body = body;
17     }
18     public String getDate() {
19         return date;
20     }
21     public void setDate(String date) {
22         this.date = date;
23     }
24     public String getAddress() {
25         return address;
26     }
27     public void setAddress(String address) {
28         this.address = address;
29     }
30     public String getType() {
31         return type;
32     }
33     public void setType(String type) {
34         this.type = type;
35     }
36     public Message(String body, String date, String address, String type) {
37         super();
38         this.body = body;
39         this.date = date;
40         this.address = address;
41         this.type = type;
42     }
43 }
View Code

 

 1 package com.ahu.lichang.androidtest;
 2 
 3 import android.os.Bundle;
 4 import android.support.v7.app.AppCompatActivity;
 5 import android.view.View;
 6 
 7 import java.io.File;
 8 import java.io.FileOutputStream;
 9 import java.util.ArrayList;
10 import java.util.List;
11 
12 public class MainActivity extends AppCompatActivity {
13     List<Message> smsList;
14     @Override
15     protected void onCreate(Bundle savedInstanceState) {
16         super.onCreate(savedInstanceState);
17         setContentView(R.layout.activity_main);
18         //虚拟10条短信
19         smsList = new ArrayList<Message>();
20         for(int i = 0; i < 10; i++){
21             Message sms = new Message("安徽大学" + i, System.currentTimeMillis() + "", "138"+i+i, "1");
22             smsList.add(sms);
23         }
24     }
25     //点击备份短信按钮
26     public void backup(View v){
27         //在内存中把xml备份短信的格式拼接出来
28         StringBuffer sb = new StringBuffer();
29         sb.append("<?xml version='1.0' encoding='utf-8' standalone='yes' ?>");
30         sb.append("<messages>");
31         for (Message sms : smsList) {
32             sb.append("<sms>");
33 
34             sb.append("<body>");
35             sb.append(sms.getBody());
36             sb.append("</body>");
37 
38             sb.append("<date>");
39             sb.append(sms.getDate());
40             sb.append("</date>");
41 
42             sb.append("<type>");
43             sb.append(sms.getType());
44             sb.append("</type>");
45 
46             sb.append("<address>");
47             sb.append(sms.getAddress());
48             sb.append("</address>");
49 
50             sb.append("</sms>");
51         }
52         sb.append("</messages>");
53 
54         File file = new File("storage/sdcard/sms.xml");//要添加两个权限
55         try {
56             FileOutputStream fos = new FileOutputStream(file);
57             fos.write(sb.toString().getBytes());
58             fos.close();
59         } catch (Exception e) {
60             e.printStackTrace();
61         }
62     }
63 }
View Code

 

  • 使用序列化器生成一个xml文件,完成短信备份
 1         //使用XmlSerializer序列化生成器完成短信备份
 2         //使用xml序列化器生成xml文件
 3         //1.拿到序列化器对象
 4         XmlSerializer xs = Xml.newSerializer();
 5         //2.初始化
 6         File file = new File("sdcard/sms2.xml");
 7         try {
 8             FileOutputStream fos = new FileOutputStream(file);
 9             //enconding:指定用什么编码生成xml文件
10             xs.setOutput(fos, "utf-8");
11 
12             //3.开始生成xml文件
13             //enconding:指定头结点中的enconding属性的值
14             xs.startDocument("utf-8", true);
15 
16             xs.startTag(null, "message");
17 
18             for (Message sms : smsList) {
19                 xs.startTag(null, "sms");
20 
21                 xs.startTag(null, "body");
22                 xs.text(sms.getBody());
23                 xs.endTag(null, "body");
24 
25                 xs.startTag(null, "date");
26                 xs.text(sms.getDate());
27                 xs.endTag(null, "date");
28 
29                 xs.startTag(null, "type");
30                 xs.text(sms.getType());
31                 xs.endTag(null, "type");
32 
33                 xs.startTag(null, "address");
34                 xs.text(sms.getAddress());
35                 xs.endTag(null, "address");
36 
37                 xs.endTag(null, "sms");
38             }
39 
40             xs.endTag(null, "message");
41 
42             //告诉序列化器,文件生成完毕
43             xs.endDocument();
44         } catch (Exception e) {
45             e.printStackTrace();
46         }
View Code

 

短信备份完成后,将SD卡中的xml文件pull出来,然后用浏览器打开该文件,就能很清晰的看见如下结果:

 

  • 使用pull解析xml格式的数据 (重要-AS实现)

     注意:1、Android studio和eclipse中的资源文件的存放位置不一样

        2、Android studio中获取资源文件的方法跟eclipse中不一样

  先在main目录下新建文件夹assets,然后再将资源文件weather.xml。

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<weather>
    <city>
        <name>上海</name>
        <temp>5°</temp>
        <pm>80</pm>
    </city>
    <city>
        <name>北京</name>
        <temp>-5°</temp>
        <pm>800</pm>
    </city>
    <city>
        <name>西安</name>
        <temp>12°</temp>
        <pm>60</pm>
    </city>
</weather>
View Code

 

  编写要用到的javabean,City.java

 1 package com.ahu.lichang.pull;
 2 
 3 /**
 4  * Created by ahu_lichang on 2017/3/18.
 5  */
 6 
 7 public class City {
 8     private String name;
 9     private String temp;
10     private String pm;
11     public String getName() {
12         return name;
13     }
14     public void setName(String name) {
15         this.name = name;
16     }
17     public String getTemp() {
18         return temp;
19     }
20     public void setTemp(String temp) {
21         this.temp = temp;
22     }
23     public String getPm() {
24         return pm;
25     }
26     public void setPm(String pm) {
27         this.pm = pm;
28     }
29     @Override
30     public String toString() {
31         return "City [name=" + name + ", temp=" + temp + ", pm=" + pm + "]";
32     }
33 }
View Code

  布局文件

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main"
 4     android:layout_width="match_parent" android:layout_height="match_parent"
 5     android:paddingBottom="@dimen/activity_vertical_margin"
 6     android:paddingLeft="@dimen/activity_horizontal_margin"
 7     android:paddingRight="@dimen/activity_horizontal_margin"
 8     android:paddingTop="@dimen/activity_vertical_margin"
 9     tools:context="com.ahu.lichang.pull.MainActivity"
10     android:orientation="vertical">
11 
12     <Button
13         android:text="pull解析"
14         android:onClick="pull"
15         android:layout_width="wrap_content"
16         android:layout_height="wrap_content" />
17 
18     <TextView
19         android:id="@+id/tv_present"
20         android:text="显示出Pull解析出来的天气信息"
21         android:layout_width="match_parent"
22         android:layout_height="wrap_content" />
23 
24 </LinearLayout>
View Code

 

  最后编写用XmlPullParser解析XML文件的具体代码

 1 package com.ahu.lichang.pull;
 2 
 3 import android.os.Bundle;
 4 import android.support.v7.app.AppCompatActivity;
 5 import android.util.Xml;
 6 import android.view.View;
 7 import android.widget.TextView;
 8 
 9 import org.xmlpull.v1.XmlPullParser;
10 
11 import java.io.IOException;
12 import java.io.InputStream;
13 import java.util.ArrayList;
14 import java.util.List;
15 
16 public class MainActivity extends AppCompatActivity {
17     private List<City> cityList;
18     private TextView tv_present;
19     @Override
20     protected void onCreate(Bundle savedInstanceState) {
21         super.onCreate(savedInstanceState);
22         setContentView(R.layout.activity_main);
23         tv_present = (TextView) findViewById(R.id.tv_present);
24     }
25 
26     public void pull(View v){
27         //获取到src文件夹下的资源文件,eclipse中这样实现
28         //InputStream is = getClassLoader().getResourceAsStream("weather.xml");
29         InputStream is = null;
30         try {
31             //在AS中,要在main下新建文件夹assets,然后将资源文件放进去
32             is = this.getApplicationContext().getAssets().open("weather.xml");
33         } catch (IOException e) {
34             e.printStackTrace();
35         }
36         //拿到pull解析器对象
37         XmlPullParser xp = Xml.newPullParser();
38         //初始化
39         try {
40             xp.setInput(is, "utf-8");
41             //获取当前节点的事件类型,通过事件类型的判断,我们可以知道当前节点是什么节点,从而确定我们应该做什么操作
42             int type = xp.getEventType();
43             City city = null;
44             while(type != XmlPullParser.END_DOCUMENT){
45                 //根据节点的类型,要做不同的操作
46                 switch (type) {
47                     case XmlPullParser.START_TAG:
48                         //获取当前节点的名字
49                         if("weather".equals(xp.getName())){
50                             //创建city集合对象,用于存放city的javabean
51                             cityList = new ArrayList<City>();
52                         }
53                         else if("city".equals(xp.getName())){
54                             //创建city的javabean对象
55                             city = new City();
56                         }
57                         else if("name".equals(xp.getName())){
58                             //获取当前节点的下一个节点的文本
59                             String name = xp.nextText();
60                             city.setName(name);
61                         }
62                         else if("temp".equals(xp.getName())){
63                             //获取当前节点的下一个节点的文本
64                             String temp = xp.nextText();
65                             city.setTemp(temp);
66                         }
67                         else if("pm".equals(xp.getName())){
68                             //获取当前节点的下一个节点的文本
69                             String pm = xp.nextText();
70                             city.setPm(pm);
71                         }
72                         break;
73                     case XmlPullParser.END_TAG:
74                         if("city".equals(xp.getName())){
75                             //把city的javabean放入集合中
76                             cityList.add(city);
77                         }
78                         break;
79                 }
80                 //把指针移动到下一个节点,并返回该节点的事件类型
81                 type = xp.next();
82             }
83             is.close();
84             StringBuffer sb = new StringBuffer();
85             for (City c : cityList) {
86                 System.out.println(c.toString());
87                 sb.append(c.toString());
88                 sb.append("\n");
89             }
90             tv_present.setText(sb.toString());
91         } catch (Exception e) {
92             e.printStackTrace();
93         }
94     }
95 }
View Code

 

   运行结果

 

posted @ 2017-03-17 21:37  ahu-lichang  阅读(895)  评论(0编辑  收藏  举报