Android基础-02
1.单元测试的相关概念
测试分类:
1、根据是否知道源代码分类:
黑盒测试:
白盒测试:
2、根据测试的粒度:
方法测试:写完一个能够独立运行的方法后就去测试;
单元测试:写完一个能够运行的业务逻辑单元就去测试;JUnit单元测试;
模块测试:对模块做整体测试;
集成测试:对整个软件做集成测试;与服务器端做链条测试;
Debug调试:使用debug调试程序;
3、根据测试的次数分类:
压力测试:LoadRunner、Jmeter;
冒烟测试:在同一时间内高频次的访问应用软件;
2.单元测试
01_JUnit单元测试 does not specify a android.test.InstrumentationTestRunner instrumentation or does not declare uses-library android.test.runner in its AndroidManifest.xml
步骤:
1、写一个业务类,添加了一个业务方法;
2、写一个测试类,添加了一个测试方法(调用了业务类业务方法),使用断言判断是预期结果与实际结果是否相同;
3、在清单文件中添加android.test.InstrumentationTestRunnerhe 和 uses-library android.test.runner;
3.Logcat日志工具的使用
日志的级别:
error:级别最高,使用红色字体显示,程序抛出异常信息使用error级别来打印;
warn: 级别较高,使用橙色字体显示,提供提示需要添加权限都是warn级别打印;
debug: 级别高,使用蓝色字体显示;
info: 级别一般,使用绿色字体显示;
verbose:级别最低,使用黑色字体显示;
4.把数据存储到文件并的取数据显示在界面上
在Android应用程序中存储数据的方式:
1、文件
2、使用SharedPreferences保存数据
3、使用SQLite数据库
4、使用ContentProvider内容提供者
5、通过网络把数据保存到服务器上
1、保存数据到文件上:
代码:
布局文件:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" tools:context=".MainActivity" >
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/et_username"
android:hint="请输入用户名" />
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/et_pwd"
android:inputType="textPassword"
android:hint="请输入密码" />
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="保存"
android:onClick="save"
/>
</LinearLayout>
MainActivity.java:
package com.itheima.savetofile;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
public class MainActivity extends Activity {
private EditText et_username;
private EditText et_pwd;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et_username = (EditText) findViewById(R.id.et_username);
et_pwd = (EditText) findViewById(R.id.et_pwd);
try {
//从文件中读取数据
File file = new File("/data/data/com.itheima.savetofile/files/info.txt");
FileReader fr = new FileReader(file);
BufferedReader br = new BufferedReader(fr);
String info = br.readLine();
//把数据显示在输入框中
if(!TextUtils.isEmpty(info)){
String[] array = info.split("##");
String username = array[0];
String pwd = array[1];
et_username.setText(username);
et_pwd.setText(pwd);
}
} catch (Exception e) {
e.printStackTrace();
}
}
public void save(View view){
String username = et_username.getText().toString().trim();
String pwd = et_pwd.getText().toString().trim();
if(TextUtils.isEmpty(username) || TextUtils.isEmpty(pwd)){
Toast.makeText(this, "用户名或密码不能为空", Toast.LENGTH_SHORT).show();
return;
}else{
try {
//把用户名和密码保存到文件上
// File file = new File("/data/data/com.itheima.savetofile/info.txt");
// FileOutputStream fos = new FileOutputStream(file);
//使用另外一个API创建一个文件
//获得/data/data/com.itheima.savetofile/files目录对象,并且打开指定的文件,如果该文件不存在,就会创建这个文件
FileOutputStream fos = this.openFileOutput("info.txt", Context.MODE_PRIVATE);
fos.write((username+"##"+pwd).getBytes());
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
6.存储到SD卡(重点)
代码:
布局文件:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity" >
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/et_username"
android:hint="请输入用户名" />
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/et_pwd"
android:inputType="textPassword"
android:hint="请输入密码" />
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="保存"
android:onClick="save"
/>
</LinearLayout>
MainActivity.java:
package com.itheima.savetosdcard;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.os.Environment;
import android.text.TextUtils;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
public class MainActivity extends Activity {
private EditText et_username;
private EditText et_pwd;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et_username = (EditText) findViewById(R.id.et_username);
et_pwd = (EditText) findViewById(R.id.et_pwd);
try {
//从文件中读取数据
File file = new File(Environment.getExternalStorageDirectory()+"/info.txt");
FileReader fr = new FileReader(file);
BufferedReader br = new BufferedReader(fr);
String info = br.readLine();
//把数据显示在输入框中
if(!TextUtils.isEmpty(info)){
String[] array = info.split("##");
String username = array[0];
String pwd = array[1];
et_username.setText(username);
et_pwd.setText(pwd);
}
} catch (Exception e) {
e.printStackTrace();
}
}
public void save(View view){
String username = et_username.getText().toString().trim();
String pwd = et_pwd.getText().toString().trim();
if(TextUtils.isEmpty(username) || TextUtils.isEmpty(pwd)){
Toast.makeText(this, "用户名或密码不能为空", Toast.LENGTH_SHORT).show();
return;
}else{
try {
//把用户名和密码保存到文件上
//获得SD卡的根目录,并且创建一个文件
File file = new File(Environment.getExternalStorageDirectory()+"/info.txt");
FileOutputStream fos = new FileOutputStream(file);
//使用另外一个API创建一个文件
//获得/data/data/com.itheima.savetofile/files目录对象,并且打开指定的文件,如果该文件不存在,就会创建这个文件
// FileOutputStream fos = this.openFileOutput("info.txt", Context.MODE_PRIVATE);
fos.write((username+"##"+pwd).getBytes());
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
7.获取SD的大小及可用空间
代码:
布局文件:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity" >
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="获得SD的空间"
android:onClick="click"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/tv_space" />
</LinearLayout>
MainActivity.java:
package com.itheima.sdcardspace;
import java.io.File;
import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.text.format.Formatter;
import android.view.View;
import android.widget.TextView;
public class MainActivity extends Activity {
private TextView tv_space;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv_space = (TextView) findViewById(R.id.tv_space);
}
public void click(View view){
//获得SD卡的根目录对象
File file = Environment.getExternalStorageDirectory();
long totalSpace = file.getTotalSpace();
long usableSpace = file.getUsableSpace();
String total = Formatter.formatFileSize(this, totalSpace);
String usable = Formatter.formatFileSize(this, usableSpace);
tv_space.setText(usable+"/"+total);
}
}
8.文件的权限概念
第一位:文件类型:
第一组权限:当前用户拥有的权限;
第二组权限:所属组拥有的权限;
第三组权限:其他用户拥有的权限;
文件的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//files),其他程序无法访问。除非在创建时指定了Context.MODEWORLDREADABLE或者Context.MODEWORLDWRITEABLE
,只有这样其他程序才能正确访问。
9.权限的使用
代码:
布局文件:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity" >
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="使用私有模式保存数据"
android:onClick="save01" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="使用追加模式保存数据"
android:onClick="save02" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="使用可读模式保存数据"
android:onClick="save03" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="使用可写模式保存数据"
android:onClick="save04" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="使用可读可写模式保存数据"
android:onClick="save05" />
</LinearLayout>
MainActivity.java:
package com.itheima.filepermission;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void save01(View view) {
try {
FileOutputStream fos = this.openFileOutput("info.txt",
Context.MODE_PRIVATE);
fos.write("private".getBytes());
fos.close();
Toast.makeText(this, "保存成功", 0).show();
} catch (Exception e) {
e.printStackTrace();
}
}
public void save02(View view) {
try {
FileOutputStream fos = this.openFileOutput("info.txt",
Context.MODE_APPEND);
fos.write("append".getBytes());
fos.close();
Toast.makeText(this, "保存成功", 0).show();
} catch (Exception e) {
e.printStackTrace();
}
}
public void save03(View view) {
try {
FileOutputStream fos = this.openFileOutput("info.txt",
Context.MODE_WORLD_READABLE);
fos.write("readable".getBytes());
fos.close();
Toast.makeText(this, "保存成功", 0).show();
} catch (Exception e) {
e.printStackTrace();
}
}
public void save04(View view) {
try {
FileOutputStream fos = this.openFileOutput("info.txt",
Context.MODE_WORLD_WRITEABLE);
fos.write("writeable".getBytes());
fos.close();
Toast.makeText(this, "保存成功", 0).show();
} catch (Exception e) {
e.printStackTrace();
}
}
public void save05(View view) {
try {
FileOutputStream fos = this.openFileOutput("info.txt",
Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE);
fos.write("append".getBytes());
fos.close();
Toast.makeText(this, "保存成功", 0).show();
} catch (Exception e) {
e.printStackTrace();
}
}
}
10.SharedPreferences存储数据(重点)
应用场景:保存给软件设置的参数;
代码:
布局文件:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity" >
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/et_username"
android:hint="请输入用户名" />
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/et_pwd"
android:hint="请输入密码" />
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="保存"
android:onClick="save"
/>
</LinearLayout>
MainActivity.java:
package com.itheima.sp;
import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
public class MainActivity extends Activity {
private EditText et_username;
private EditText et_pwd;
private SharedPreferences sp;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et_username = (EditText) findViewById(R.id.et_username);
et_pwd = (EditText) findViewById(R.id.et_pwd);
//获得sp对象
sp = this.getSharedPreferences("info", Context.MODE_PRIVATE);
//根据参数名查找参数
String name = sp.getString("name", "");
String pwd = sp.getString("pwd", "");
et_username.setText(name);
et_pwd.setText(pwd);
}
public void save(View view){
String username = et_username.getText().toString().trim();
String pwd = et_pwd.getText().toString().trim();
if(TextUtils.isEmpty(username) || TextUtils.isEmpty(pwd)){
Toast.makeText(this, "用户名或密码不能为空", 0).show();
return;
}else{
//使用SharedPreferences保存数据
//得到系统提供的SharedPreferences对象
//info 保存数据的文件名
//mode 保存文件使用操作模式
sp = this.getSharedPreferences("info", Context.MODE_PRIVATE);
//获得sp的编辑器
Editor editor = sp.edit();
//使用editor数据
editor.putString("name", username);
editor.putString("pwd", pwd);
//只有调用了commit或者apply方法才能把数据保存sp对象中
editor.commit();
Toast.makeText(this, "保存成功", 0).show();
}
}
}
11.序列化xml格式的数据到文件上
应用场景:备份短信、联系人;
代码:
package com.itheima.serializerablexml;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import org.xmlpull.v1.XmlSerializer;
import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.util.Xml;
import android.view.View;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void save(View view) {
try {
// 得到序列化器
XmlSerializer s = Xml.newSerializer();
// 初始化序列化器
File file = new File(Environment.getExternalStorageDirectory()
+ "/news.xml");
FileOutputStream fos = new FileOutputStream(file);
s.setOutput(fos, "UTF-8");
// 序列化数据
s.startDocument("UTF-8", true);
// channel
s.startTag(null, "channel");
// item
s.startTag(null, "item");
// title
s.startTag(null, "title");
s.text("港媒曝剧组疑潜规则 女星陪制片1周3次");
s.endTag(null, "title");
// description
s.startTag(null, "description");
s.text("据香港媒体报道,演艺圈潜规则时有所闻,日前男星刘至翰更在网上曝光一张疑似剧组人员与女星的对话截图“先签合同,拍了再陪,无需顾虑”,让刘至翰气骂此歪风践踏梦想又物化女性。");
s.endTag(null, "description");
// image
s.startTag(null, "image");
s.text("http://192.168.20.91:8080/image/1.jpg");
s.endTag(null, "image");
// type
s.startTag(null, "type");
s.text("1");
s.endTag(null, "type");
s.endTag(null, "item");
s.endTag(null, "channel");
s.endDocument();
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
12.使用pull解析xml格式的数据 (重要)
SAX、DOM4j,DOM
pull:事件类型的解析器;
事件类型:
START_DOCUMENT 解析到文档的开头部分;
END_DOCUMENT解析到文档的结尾部分;
START_TAG 标签的开头部分;
END_TAG 标签的结束部分;
代码:
package com.itheima.pullxml;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.util.Xml;
import android.view.View;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void parse(View view) {
try {
// 得到pull解析器
XmlPullParser parser = Xml.newPullParser();
// 初始化解析器
File file = new File(Environment.getExternalStorageDirectory()
+ "/news.xml");
FileInputStream fis = new FileInputStream(file);
parser.setInput(fis, "UTF-8");
// 得到解析的事件类型
int type = parser.getEventType();
while (type != XmlPullParser.END_DOCUMENT) {
switch (type) {
case XmlPullParser.START_TAG://解析到开始标签位置
if ("item".equals(parser.getName())) {//获得标签的名称
System.out.println("....item........");
} else if ("title".equals(parser.getName())) {
//获得标签体的内容
String title = parser.nextText();
System.out.println("title:" + title);
} else if ("description".equals(parser.getName())) {
String description = parser.nextText();
System.out.println("description:" + description);
}else if ("image".equals(parser.getName())) {
String image = parser.nextText();
System.out.println("image:" + image);
}else if ("type".equals(parser.getName())) {
String newstype = parser.nextText();
System.out.println("type:" + newstype);
}else if ("comment".equals(parser.getName())) {
String comment = parser.nextText();
System.out.println("comment:" + comment);
}
break;
case XmlPullParser.END_TAG://解析到标签的结束位置
if ("item".equals(parser.getName())) {
System.out.println("..../ item........");
}
break;
}
// 解析下一个标签
type = parser.next();
}
fis.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
时间: 2024-11-07 05:55:54