安卓1102_测试 LogCat 登陆 xml序列化 解析 json解析
来源:互联网 发布:郝斌java怎么样 编辑:程序博客网 时间:2024/05/14 03:33
第二天数据的存储
1.测试的相关概念 (了解)
SUV 好的程序不是开发出来的,是测试出来的 jd 充话费 当当 -10 1.按照是否知道代码 黑盒测试 不知道代码 白盒测试 知道代码 2.按照测试的粒度 方法测试 单元测试 集成测试 系统测试 3.测试的暴力程度 暴力测试 硬件相关 压力测试 12306 android中的压力测试: adb shell 下的指令, monkey 次数 (手机测试) adb -s emulator-5556 shell进入指定手机 input text 文本内容;可以直接往文本框输入内容 monkey -p pacakagenmae count;
2.单元测试(了解,会用即可)
1.创建一个类集成AndroidTestCase,当前类就具备了单元测试功能2.在androidmanifest文件的applicaton节点下配置一个 uses-library <uses-library android:name="android.test.runner" />3.在androidmanifest文件的manifest节点下配置一个 instrumentation <instrumentation android:name="android.test.InstrumentationTestRunner" android:targetPackage="com.itheima.junit" />4.如果不知道怎么配置manifest。可以新建一个android test project public class CalzTest extends AndroidTestCase { public void testAdd(){ //创建Calz对象 Calz calz = new Calz(); //调用方法 int result = calz.add(5, 7); //判断返回结果, 使用junit下的断言方法判断 ,expected:期望的值 actual:实际的结果 assertEquals(12, result); } }
3.Logcat日志猫工具的使用 (会用即可)
五种级别颜色不同 v d i w e在公司开发中一般用Log打日志信息,还需对Log封装成一个Util,用一个开关控制public class LogUtils { private static boolean islog = false; public static void v(String tag ,String msg){ if(islog ){ Log.v(tag, msg); } } public static void d(String tag ,String msg){ if(islog){ Log.v(tag, msg); } } public static void i(String tag ,String msg){ Log.v(tag, msg); } public static void w(String tag ,String msg){ Log.v(tag, msg); } public static void e(String tag ,String msg){ Log.v(tag, msg); } } 封装成对象调用 LogUtils.v(tag , "我是v级别"); LogUtils.d(tag , "我是d级别"); LogUtils.i(tag , "我是i级别"); LogUtils.w(tag , "我是w级别"); LogUtils.e(tag , "我是e级别");
4.把数据存储到文件(login案例) android 下的数据存储
1.写布局 LinearLayout + RelativeLayout 2.找到相应的控件 3.设置按钮的点击事件 4.在onclick方法中获取用户名,密码,是否记住密码 5.判断用户名,密码是否为空,如果空给用户提示,不空,提交服务器(省略) 6.判断是否记住密码,如果记住,保存用户名密码到文件 7.下次再进入登录界面时回显用户名密码 权重weight <CheckBox android:layout_weight="3" android:id="@+id/ch" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/pass" /> <Button android:layout_weight="1" android:id="@+id/bu" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/login" /> text1 = (EditText) findViewById(R.id.text1); text2 = (EditText) findViewById(R.id.text2); Button bu = (Button) findViewById(R.id.bu); ch = (CheckBox) findViewById(R.id.ch); //从本地获取信息 HashMap<String,String> hs = Save.get(); if(hs != null) { String s1 = hs.get("text3"); String s2 = hs.get("text4"); text1.setText(s1); text2.setText(s2); } //设置按钮点击事件 bu.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { //获取输入框的值 String text3 = text1.getText().toString(); String text4 = text2.getText().toString(); //日志猫 Log.i(MainActivity.class.getSimpleName(), "账号 = "+ text3 +"密码 = "+ text4); //判断输入框的值 if(TextUtils.isEmpty(text3) || TextUtils.isEmpty(text4)) { //参数一:上下文 //参数二:友好提示 //参数三:提示的时间长短 Toast.makeText(MainActivity.this, "账号或者密码不能为空",Toast.LENGTH_SHORT ).show(); //如果不为空,提示用户登录成功 } else { if(ch.isChecked()) { //勾选 //静态方法不能用在非静态 boolean save = Save.getSave(text3, text4); if(save) { //勾选上提示用户,保存成功 Toast.makeText(MainActivity.this, "保存成功",Toast.LENGTH_SHORT ).show(); } else { Toast.makeText(MainActivity.this, "保存失败",Toast.LENGTH_SHORT ).show(); } //保存信息,如果成功,提示信息,失败也提示 } else { //没有勾选提示用户登录成功 Toast.makeText(MainActivity.this, "登录成功",Toast.LENGTH_SHORT ).show(); } } } });
布局存储位置
File file = new File("/data/data/com.heima.login/1.txt");String path = Environment.getExternalStorageDirectory().getPath(); /mnt/sdcard/1.txt//需要传入ContextString path = context.getFilesDir().getPath();data 包名files文件夹//参数默认是 private == 0;FileOutputStream fileOutput = context.openFileOutput("2.txt", 0);data 包名files文件夹File file = new File(path, "2.txt");FileOutputStream fops = new FileOutputStream(file);fops.write(result.getBytes());fops.close();return true;
5.存储到SD卡,获取SD的大小及可用空间 (重点)
sdcard使用注意事项1.权限问题 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>2.硬性编码问题 String path = Environment.getExternalStorageDirectory().getPath();3.判断sdcard是否存在 if(!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){ Toast.makeText(mContext,"sdcard不存在或未挂载" , Toast.LENGTH_LONG).show(); return; }4.判断sdcard剩余控件 //获取sdcard目录的文件对象 File sdcard_FileDir = Environment.getExternalStorageDirectory(); //获取剩余空间 long usableSpace = sdcard_FileDir.getUsableSpace(); //context :context上下文对象, number:文件的大小,将文件大小格式化成String String usableSpace_str = Formatter.formatFileSize(mContext, usableSpace); //获取总空间 long totalSpace = sdcard_FileDir.getTotalSpace(); String totalSpace_str = Formatter.formatFileSize(mContext, totalSpace); if(usableSpace < 1024 * 1024 *200){ Toast.makeText(mContext,"sdcard空间不足,剩余"+usableSpace_str+";总空间:"+totalSpace_str , Toast.LENGTH_LONG).show(); return; }
7.文件的权限概念 (了解)
//通过context对象打开一个私有目录下的文件读取流context.openFileinput(String name);//通过context对象打开一个私有目录下的文件写入流 ,name :不能有路径,mode:文件的操作模式, private append read writecontext.openFileOutput(String name,int mode)linux下一个文件的权限由10位表示第1位:代表文件的类型,d:文件夹,l:快捷方式,-:文件2-4: 文件所属用户对本文件的权限 , rwx, 如果是-,二进制用0表示,非-,用二进制1表示。目的是转化10进制赋权用。5-7:文件所属用户组对本文件的权限8-10:其他用户对本文件的权限android 下的用户权限大小排列: root system shell app
8.SharedPreferences介绍 (重点)
sharedPreferences存放数据是基于xml文件的。这些sharedpreferences文件存放在私有目录下的shared_prefs文件夹下应用场景:一般存放一些设置信息及标志类型的数据*******使用SharedPreferences存数据:1.通过Context对象获取一个SharedPreferences对象 SharedPreferences sharedPreferences = context.getSharedPreferences( "userinfo.txt", Context.MODE_PRIVATE);2.通过SharedPreferences对象的edit方法获取一个Editor对象 Editor editor = sharedPreferences.edit();3.往Editor对象中存放数据,键值对 editor.putString("username", username); editor.putString("password", password);4.提交Editor对象 editor.commit();*******读取SharedPreferences中存放的数据:1.通过Context对象获取一个SharedPreferences对象 SharedPreferences sharedPreferences = context.getSharedPreferences( "userinfo.txt", Context.MODE_PRIVATE);2.使用SharedPreferences对象获取存放的数据,键值对的方式获取 //key : 读取哪个key的值, defValue:默认值,如果sharedPreference文件不存在或者key不存在时返回默认值。 String username = sharedPreferences.getString("username", "admin"); String password = sharedPreferences.getString("password", "admin");另一种方式得到一个SharedPreferences对象,是默认的SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);
9 生成xml的2种方式
XmlSeriliazer try{ //**拿到短信数据 ArrayList<SmsBean> allSms = SmsDao.getAllSms(); //**序列化xml文件 //1.通过Xml创建一个XmlSerializer对象 XmlSerializer xs = Xml.newSerializer(); //2.设置XmlSerializer对象的写入流的参数 xs.setOutput(context.openFileOutput("smsBackup2.xml", Context.MODE_PRIVATE), "utf-8");//os:xml文件的写入流,encoding :流的编码 //3.序列化一个xml文件的声明头 xs.startDocument("utf-8", true);//encoding:xml内容的编码 standalone:该xml文件是否独立 //4.序列化一个xml的根节点 xs.startTag(null, "Smss");//namespace :命名空间 name:标签名称 //5.循环遍历list集合,序列化所有的短信内容 for (SmsBean smsBean : allSms) { xs.startTag(null, "Sms"); //写一个属性 xs.attribute(null, "id", smsBean.id+"");//name:属性名称,value:属性值 xs.startTag(null, "num"); xs.text(smsBean.num);//序列化一个内容 xs.endTag(null, "num"); xs.startTag(null, "msg"); xs.text(smsBean.msg);//序列化一个内容 xs.endTag(null, "msg"); xs.startTag(null, "date"); xs.text(smsBean.date);//序列化一个内容 xs.endTag(null, "date"); xs.endTag(null, "Sms"); } //6.序列化一个根节点的结束标签 xs.endTag(null, "Smss"); //7.完成xml的写入 xs.endDocument(); return true; }catch (Exception e) { e.printStackTrace(); }
10.使用pull解析xml格式的数据
dom解析:基于全文加载 , sax解析:基于事件的逐行解析, pull解析:同sax解析一样XmlPullParsertry{ //1.通过Xml创建一个XmlPullParser对象 XmlPullParser xpp = Xml.newPullParser(); //2.设置XmlPullParser对象的读取流 //通过context对象获取一个Resources对象 Resources resources = context.getResources(); //通过Resources对象可以获取assets的管理者对象 AssetManager assets = resources.getAssets(); //通过assets管理管理者可以打开assets的一个文件读取流 InputStream open = assets.open("smsBackup2.xml"); //xpp.setInput(context.openFileInput("smsBackup2.xml"), "utf-8"); xpp.setInput(open, "utf-8"); //3.获取XmlPullParser对象当前事件类型 int type = xpp.getEventType(); //4.判断事件类型是否到文档结束 while(type != XmlPullParser.END_DOCUMENT){ //5.如果不到文档结束,循环遍历所有的节点,并解析节点上的内容 String currentTagName = xpp.getName(); switch (type) { case XmlPullParser.START_TAG: if(currentTagName.equals("Smss")){ list = new ArrayList<SmsBean>(); }else if(currentTagName.equals("Sms")){ bean = new SmsBean(); bean .id = Integer.parseInt( xpp.getAttributeValue(null, "id")); }else if(currentTagName.equals("num")){ bean.num = xpp.nextText(); }else if(currentTagName.equals("msg")){ bean.msg = xpp.nextText(); } else if(currentTagName.equals("date")){ bean.date = xpp.nextText(); } break; case XmlPullParser.END_TAG: if(currentTagName.equals("Sms")){ list.add(bean); } break; default: break; } //6.解析一个节点内容后,需要获取下一行的事件类型 type = xpp.next(); } return list.size(); }catch (Exception e) { e.printStackTrace(); }
xml json->开发环境->数据存储->mysql->sqlite
XML: 用来传输和存储数据。JSON:用来传输和存储数据。JSON 比 XML 更小、更快,更易解析。
XML简介
[1]什么是XMl XML 指[可扩展][标记语言](EXtensible Markup Language) XML 是一种标记语言,很类似 [HTML] XML 的设计宗旨是传输数据,而非显示数据 XML 标签没有被预定义。您需要自行定义标签。 XML 被设计为具有自我描述性。 XML 是 W3C 的推荐标准 [2]为什么要用XMl XML 可扩展标记语言 XML 被设计用来传输和存储数据 XML (重要)可以用来做配置文件
XML的声明
[1]定义一个xml文件,格式是固定的[2]如何验证一个xml文件是否正确呢,直接浏览器查看就可以了[3]xml的编码
XML的语法
[1]所有 XML 元素都须有关闭标签[2]XML 标签对大小写敏感[3]XML 必须正确地嵌套 [4]XML 文档必须有根元素 <?xml version="1.0" encoding="utf-8"?>[5]XML 的属性值须加引号[6]XML 中,一些字符拥有特殊的意义.需要转义。比如 < 等于 <[7]XML 中的注释\[8]在 XML 中,空格会被保留[9]CDATA区 所有 XML 文档中的文本均会被解析器解析。只有 CDATA 区段(CDATA section)中的文本会被解析器忽略。 <![CDATA[ ... ]]><!-- --> 注释
XML中元素的概念
[1]XML 元素指的是从(且包括)开始标签直到(且包括)结束标签的部分。[2]元素可包含其他元素、文本或者两者的混合物。元素也可以拥有属性[3]命名规则 [3.1]名称可以含字母、数字以及其他的字符 [3.2]名称不能以数字或者标点符号开始 [3.3]名称不能以字符 “xml”(或者 XML、Xml)开始 [3.4]名称不能包含空格
xml中三种解析方式介绍
[1]dom解析 Document Object Model 官方推荐的标准 原理:把xml文件加载到内存当中,在内存中形成一个树形结构 优点:可以进行增删改查 缺点:容易内存泄漏[2]sax解析 Simple Api For Xml 不是官方推荐的标准 是从一个程序员社区研究出来的 原理:一边解析 一边处理 一边释放内存 实际上就是一行一行的读 优点:不会内存泄漏 缺点:不能够对数据进行增删改 API Application programming Interface应用程序接口[3]xmlPull解析 Android中内置的解析器 这个必须会 原理:类似sax[4]3种解析方法 只有思想 并没有提供相应的api实现 sun公司提供了一套接口Jaxp Java API For Xml processing 实现dom和sax解析
dom解析
dom解析会把xml元素 属性 文本 都当成节点[1]javax.xml.parsers [2]DocumentBuilder 使其从 XML 文档获取 DOM 文档实例。使用此类,应用程序员可以从 XML 获取一个 Document[3]DocumentBuilderFactory 使应用程序能够从 XML 文档获取生成 DOM 对象树的解析器[4]Document XML 文档步骤: [1]获取DocumentBuilderFactory 解析器工厂 [2]获取DocumentBuilder 解析器 [3]解析xml文件 获取Document 整个文档对象 [4]获取xml里面的内容 [5]获取节点里面每次个节点对象代码: // [1]获取DocumentBuilderFactory 解析器工厂 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); // [2]获取DocumentBuilder 解析器 DocumentBuilder builder = factory.newDocumentBuilder(); // [3]解析xml文件 获取Document 整个文档对象 Document document = builder.parse("books.xml"); // [4]获取xml里面的内容 NodeList nodeList = document.getElementsByTagName("title"); for (int i = 0; i < nodeList.getLength(); i++) { // [5]获取节点里面每次个节点对象 Node node = nodeList.item(i); System.out.println(node.getTextContent()+node.getNodeType()+node.getNodeName()); }
sax解析
步骤: [1]获取一个 SAXParserFactory 解析器工厂 [2] 获取一个SAXParser 解析器 [3]开始解析xml代码: // [1]获取一个 SAXParserFactory 解析器工厂 SAXParserFactory factory = SAXParserFactory.newInstance(); // [2] 获取一个SAXParser 解析器 SAXParser parser = factory.newSAXParser(); // [3]开始解析xml parser.parse("books.xml", new DefaultHandler() { // 文档开始 @Override public void startDocument() throws SAXException { super.startDocument(); System.out.println("startDocument"); } // 元素开始 @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { super.startElement(uri, localName, qName, attributes); System.out.println("startElement = " + qName); } // 文本内容 @Override public void characters(char[] ch, int start, int length) throws SAXException { super.characters(ch, start, length); System.out.println("characters = " + new String(ch, start, length)); } // 元素结束 @Override public void endElement(String uri, String localName, String qName) throws SAXException { super.endElement(uri, localName, qName); System.out.println("endElement"); } // 文档结束 @Override public void endDocument() throws SAXException { super.endDocument(); System.out.println("endDocument"); } });
xmlpull解析把数据封装到javaBean中
xmlPull解析 Android中内置的解析器 这个必须会原理:类似sax 与sax区别:sax强制解析所有,xmlPull解析可控,想解析哪个哪里就解析哪里事件类型: public static final int START_DOCUMENT = 0; public static final int END_DOCUMENT = 1; public static final int START_TAG = 2; public static final int END_TAG = 3; public static final int TEXT = 4;步骤 [1]获取一个 XmlPullParserFactory 解析工厂 [2]获取一个 XmlPullParser [3]读取xml文档 [4]获取事件类型 5]解析器向下移动代码: // [1]获取一个 XmlPullParserFactory 解析工厂 XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); // [2]获取一个 XmlPullParser XmlPullParser parser = factory.newPullParser(); // [3]读取xml文档 parser.setInput(new FileInputStream("books.xml"), "utf-8"); // [4]获取事件类型 int eventType = parser.getEventType(); System.out.println(eventType); // [5]解析器向下移动 eventType = parser.next(); System.out.println(eventType); eventType = parser.next(); System.out.println(eventType); eventType = parser.next(); System.out.println(eventType);解析数据:while (eventType != XmlPullParser.END_DOCUMENT) { switch (eventType) { case XmlPullParser.START_TAG: if (parser.getName().equals("book")) { book = new Book(); String id = parser.getAttributeValue(0); book.setId(id); } else if (parser.getName().equals("title")) { book.setTitle(parser.nextText()); } else if (parser.getName().equals("price")) { book.setPrice(parser.nextText()); } break; case XmlPullParser.END_TAG: if (parser.getName().equals("book")) { books.add(book); } break; } eventType = parser.next();}
json介绍
简介: [1]JSON:JavaScript 对象表示法(JavaScript Object Notation)。 [2]JSON 是存储和交换文本信息的语法。类似 XML。 [3]JSON 比 XML 更小、更快,更易解析。 [4]JSON 是轻量级的文本数据交换格式 [5]JSON 独立于语言 * [6]JSON 具有自我描述性,更易理解 { "name":"张三" }语法: [1]数据在名称和键值对中 名称和键值对在双引号中,名称后面写一个冒号,然后是值: {"name" : "张三"} 等价于 name = "张三" [2]数据由逗号分隔 [3]花括号保存对象 { "name":"张三" , "age":"18" } 等价 name = "张三" age = "18" [4]方括号保存数组 { "person": [ { "name":"张三" , "age":"18" }, { "name":"王五" , "age":"19" }, { "name":"李四" , "age":"20" } ] }
json解析的实现
json解析 android内置JSONObject =解析对象JSONArray =解析数组代码: @Testpublic void jsonTest() { try { String json="{'title':'c语言从入门到放弃','price':'29','category':'c'}"; JSONObject jsonObject = new JSONObject(json); String title = jsonObject.getString("title"); System.out.println("title = "+title); json="[{'title':'c语言从入门到放弃','price':'29','category':'c'}," + "{'title':'Java从入门到转行','price':'39','category':'java'}]"; JSONArray array = new JSONArray(json); jsonObject = (JSONObject) array.get(1); String category = jsonObject.getString("category"); System.out.println("category = "+category); } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); }}
0 0
- 安卓1102_测试 LogCat 登陆 xml序列化 解析 json解析
- 安卓实训第十二天---xml解析PULL解析的实现,安卓测试,logcat的使用方法
- 单元测试&Logcat&数据存储&XML的序列化和解析
- 安卓xml序列化和pull解析笔记
- 安卓开发-xml的序列化和解析实例
- 安卓_解析
- 安卓Json解析
- 安卓Json解析
- plist解析和JSON序列化与反序列化(JSON解析),XML解析
- 安卓xml解析
- 解析 xml 安卓
- 安卓 解析xml
- 安卓xml解析
- 2015.5.10安卓笔记之sharedprefrence、xml序列化、pull解析xml文件
- 安卓对数据的解析,对xml文件解析,以及对json的解析
- xml json 数据封装 传递(序列化) 解析
- Unity序列化之XML,JSON--------合成与解析
- Unity序列化之XML,JSON--------合成与解析
- leetcode刪除倒數第几个节点
- 编写代码实现,模拟用户登录情景,并且只能登录三次。
- git 远程版本库,github提供服务原理,git自动更新发送邮件
- [kuangbin带你飞]专题四 最短路练习 J POJ 1511
- 汇编常用int 21H系统功能调用
- 安卓1102_测试 LogCat 登陆 xml序列化 解析 json解析
- 应用程序无法正常启动0xc000007b 问题记录
- SpringBoot基本配置
- oracle基础笔记
- MongoDB服务最简单的启动和连接
- 802.11网络性能解析
- Windows安装MySQL 5.7
- String.format()方法使用
- Java代码块