zoukankan      html  css  js  c++  java
  • 单元测试+内存、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("
    ");
    89             }
    90             tv_present.setText(sb.toString());
    91         } catch (Exception e) {
    92             e.printStackTrace();
    93         }
    94     }
    95 }
    View Code

       运行结果

  • 相关阅读:
    java后台保存JSON
    查询树节点及其所有上级节点sql语句
    查询树节点及其所有下级节点sql语句
    Hibernate查询机制使用原生sql语法查询
    SSH框架通过poi导出excel表格
    java通过poi导入excel数据
    各类型日期date的相互转化
    推荐一下我喜欢的软件
    青岛市赛总结——远征石油大学
    My learn of git
  • 原文地址:https://www.cnblogs.com/ahu-lichang/p/6568463.html
Copyright © 2011-2022 走看看