单元测试+内存、SD卡、SP读写+XmlPullParser
测试:
- 测试的相关概念
1、根据是否知道源代码分类:
黑盒测试: a - b - c 边值测试 测试逻辑业务
白盒测试: 根据源代码写测试方法 或者 测试用例;
2、根据测试的粒度分类:
方法测试:写完一个方法后就测试
单元测试:测试一个能够独立运行的业务逻辑单元;
集成测试:整体测试项目 联调
系统测试:对整个系统进行测试
3、根据测试的暴力程度:
冒烟测试:高频次的点击软件
压力测试:使用测试工具:LoadRunner、Jmeter
单元测试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>
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 }
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"/>
- 获取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 }
- 文件的权限概念
文件的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 }
- 使用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 }
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 }
- 使用序列化器生成一个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 }
短信备份完成后,将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>
编写要用到的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 }
布局文件
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>
最后编写用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 }
运行结果