安卓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 中,一些字符拥有特殊的意义.需要转义。比如 < 等于 &lt;[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