今天做了下文件存储的小案例,并借此巩固一下Android中的单元测试及MVC的设计模式.

.AndroidMVC模式如下

image

步骤1: 布局编辑:

布局页面及代码如下:

image

<Button        android:id="@+id/btnSave"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_below="@+id/etContent"        android:layout_centerHorizontal="true"        android:layout_marginTop="39dp"        android:text="@string/btn_tip_save" />    <EditText        android:id="@+id/etContent"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_alignParentTop="true"        android:layout_centerHorizontal="true"        android:layout_marginTop="74dp"        android:drawableLeft="@drawable/icon"        android:ems="15"        android:hint="@string/et_tip_writeContent"        android:minLines="3" >                <!-- ems长度 -->        <requestFocus />    </EditText>

其中:android:ems="15" 代表设置TextView或EditText的宽度为15个字符的宽度

步骤2:业务层编辑:

代码如下:

package com.example.savafile.service;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import android.content.Context;/**用于对页面的操作,此处为数据的保存与读取*/public class FileService {    private Context context;    private String fileName;    /**初始化上下文和文件名(路径)*/    public FileService(Context context, String fileName) {        this.context = context;        this.fileName = fileName;    }    public boolean save(String content) {        boolean isSaveSuccessed = false;        BufferedWriter bw=null;        try {            //为Context建立输出流(数据流向程序外)            //参数1为存储的文件名,  参数2 为MODE模式            FileOutputStream fos = context.openFileOutput(fileName, Context.MODE_PRIVATE);//构建字节输出流            OutputStreamWriter writer = new OutputStreamWriter(fos);//将字节输出流包装为字符输出流            bw = new BufferedWriter(writer);//将字符输出流包装为缓存流?            bw.write(content);//write与OutputStream的区别            isSaveSuccessed = true;        } catch (FileNotFoundException e) {            e.printStackTrace();        } catch (IOException e) {            e.printStackTrace();        }finally{            try {                //write和fos为什么不用关闭呢?                if (bw != null) {                    bw.close();                }            } catch (IOException e) {                e.printStackTrace();            }        }        return isSaveSuccessed;    }    public String read(){        String line;        StringBuilder sb = new StringBuilder();//作用是什么        BufferedReader br = null;                try {            FileInputStream fis = context.openFileInput(fileName);//通过Context中的openFileInput(路径)的方法获取输入流            br = new BufferedReader(new InputStreamReader(fis));            while((line = br.readLine()) != null){                sb.append(line);//s +=line;作用一致,但会造成大量的内存浪费            }        } catch (IOException e) {//br.readLine()异常块            e.printStackTrace();        }                return sb.toString();    }}

此处用到了JAVA中的I/O流,即输入输出流,小编搜索相应资料如下:

image

想要具体了解的可以通过书籍,网络等资料进行学习.

--------------------------------------------------------------------------------------

需要注意的是,对业务层进行编辑之后需要对业务层中的方法进行单元测试,以确保其正确性.确保业务层内的方法正确后,再进行对控制层(Activity)的编辑,此时,若再出错,则可确定错误不在业务层,去控制层或模型层进行排错即可.

单元测试步骤如下:

①在AndroidManifest.xml文件中配置单元测试需要的环境

image

图中,红线内的内容即为所需

②通过继承Android提供的AndroidTestCase父类来编写相应的测试方法

代码如下:

package com.example.savafile.serviceTest;import com.example.savafile.service.FileService;import android.test.AndroidTestCase;/**单元测试*/public class ServiceTest extends AndroidTestCase {    /**测试FileService中的save方法*/    public void testSave() {        FileService testSave = new FileService(getContext(), "data");//存储为xml文件?        testSave.save("hello test");    }        /**测试FileService中的Read方法*/    public void testRead() {        FileService testRead = new FileService(getContext(), "data");//存储为xml文件?        testRead.read();    }}

单元测试的方法名最好以 test+需要测试的方法名 命名

③运行测试:

在打开虚拟机(或真机)的情况下,在单元测试类中右击大纲的方法,运行为android项目即可

image

image

测试结果:

image

成功时,红色标记部分会显示绿色进度条,反之,则为红色进度条,且在黄色标记区域显示测试方法的错误信息,非常好用哦

步骤3: 控制层编辑:

代码如下:

package com.example.savafile;import com.example.savafile.service.FileService;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.Toast;/**Android开发遵循的MVC原则  M业务层(FileService)  V(xml布局) C控制层(Activity) * 测试业务层,必须要进行单元测试,确定业务层方法没问题的情况下,编写控制层*/public class MainActivity extends Activity implements OnClickListener {    private Button btnSvae;    private EditText etContent;        @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);                initialize();        readText();            }        /**初始化控件,并设置相应的监听器*/    private void initialize() {        btnSvae = (Button) findViewById(R.id.btnSave);        etContent = (EditText) findViewById(R.id.etContent);                btnSvae.setOnClickListener(this);    }        /**读取之前存储的数据*/    private void readText(){        String data = fileService.read();        if(data!=null){            etContent.setText(data);        }    }        FileService fileService = new FileService(MainActivity.this, "data.txt");         /**监听器方法*/    @Override    public void onClick(View v) {        switch (v.getId()) {        case R.id.btnSave:            if(fileService.save(etContent.getText().toString())){//是否保存成功                Toast.makeText(MainActivity.this, "恭喜您,保存成功!", Toast.LENGTH_SHORT).show();            }else{                Toast.makeText(MainActivity.this, "好可惜,保存失败!", Toast.LENGTH_SHORT).show();            }            break;        }    }}

到此,就算编辑结束了.谢谢

更多相关文章

  1. Android Q 测试版
  2. Android View onMeasure 方法
  3. Android单元测试时如何使用log查看输出结果
  4. Android Studio 3.0以后打包修改文件名方法
  5. 【Android】android开发过程遇到的问题以及解决方法总结
  6. android图片压缩方法
  7. android ndk 入门2 - 基本方法实现
  8. Android中获得上下文的静态方法

随机推荐

  1. Android模拟器无法上网问题
  2. Android(安卓)Okhttp3了解及封装类使用
  3. android原生widget 电量控制(PowerSave)设
  4. Android(安卓)NotePad的简单实现
  5. 向sd写文件时权限
  6. android INSTALL_FAILED_INSUFFICIENT_ST
  7. Android实现简单断点续传和下载到本地功
  8. Android(安卓)json通信(解析)方法
  9. android studio 编译调试 错误
  10. android布局页面中引入另一个布局页面