android笔记2

来源:互联网 发布:单片机继电器怎么使用 编辑:程序博客网 时间:2024/03/29 23:20
上一篇     下一篇共18篇  

编辑 | 删除【android笔记】(2)2013年02月11日 00:34:00

2013_2_8_CZBK_12

 

数据的存储与访问


文件 io技术
参数
sqlite数据库
内容提供者
网络

创建一个android项目

文件操作

Ui---找到按钮 添加点击事件处理


把业务层写在业务类中。

 

FileService service = new FileService();
service.save(filename,content);

Toast.makeText(getApplicationContext(),T.string.success.1).show();


在业务类里面添加注释

酱紫 MainActivity这层的代码就完成了。


接下来 打开save方法,采用io技术实现文件的保存

首先得到文件的输出流对象 FileOutputStream outStream = content.openFileOutput(name,Context.。。。);

第一个参数文件名称,不要带路径
第二个参数用于指定文件的操作模式 文件有几种行为 以追加的方式、覆盖的方式写文件 另外文件还有访问权限的控制 
如果希望创建出来的文件只能被本文件访问,并且覆盖 采用私有操作模式


outStream.write(getByte());
outStream.close();


数据时以2禁制写到文件中,所以要把字符串转换。。。。getByte()

 

 


android 上下文对象中提供了一个方法可以迅速的得到输出流对象


private Context context;

 

 

私有操作模式 创建出来的文件只能被本应用访问,其他应用无法访问该文件,另外采用私有模式创建的文件,写入文件中的内容会覆盖原文件内容

对外声明抛出意外,所以要捕获,但是不在方法中捕获,如果代码出现问题,希望王外抛出 最用例外会被抛给最外层,也就是使用(调用)了业务类的这一层 。例外抛给 activity ,由activity给用户提示保存失败的显示


(打开了activity)
捕获这个例外 如果失败给用户添加一个保存失败的显示

 

 

 

 


应用产生的数据

data/data

默会保存在包底下

保存 出错 擦一下 logcat指一下 显示 16行 空指针 因为没有 最好通过构造器来给他复制 因为如果set给他赋值,有时候会忘记调用方法赋值 所以下面 我们生成一个构造器 使用


source --- Generate Costructor using fileds

 

回到activity 使用getApplicationContext()把上下文对象传进去


当我们采用


接下来我们 用到输入流


写一个方法


public String read(String filename) throws Exception{
 ByteArrayOutputStream outStream = new ByteArrayOutputStram();
 FileInputStream inStream = context.openFileInput(filename);
 byte{}buffer = new byte[1024];
  int len =0;
 inStream.raed();//假设读不完 把缓存区填满了,数据类型会返回。只要没读完 这个方法是不断调用的 如果读完 返回值是-1 否则是读进去的数据葛苏 所以做个判断 只要len不是-1就没有读完
 
 return null;

 

}


往内存输出的输出流对象  ByteArrayOutputStream


把每次写的都读到内存中,然后再从内存中得到数据


outStream.write();


然后 byte data = outStream.toByteArray(); 从内存中获取数据

return new String (data);


输入流---read()--->buffer字节数组----往内存输出的输出流对象ByteArrayOutputStream的write()方法---->内存--内存输出流对象的toByteArray()方法--->到新数组data中

之所以这么做 是为了 把输入流分步读到内存中,然后一下子输出来


调用read方法 把数据从输入流中读到字节数组中,(返回值是当前读到的数组长度,当读完时返回值是-1)
然后把每次读的数据得到,每次会把读到的数据填到buffer数组中,也就是说第二次得到的数据会把第一次得到的数据替换掉,所以每次都要把得到的数据存起来。————可以使用一个往内存输出的输出流对象

ByteArrayOutputStream,也就是说每次把得到的数据写入内存中,然后从内存中得到所有的数据
buufer 把数据中的数据写到内存中
offset 数组什么范围的数据写到内存中 0
然后从内存中得到存放在内存中的所有数据 byte data =outStream.toByteArray();

 

目前得到的数据,实际上是save方法里那个outStream.write(content.getByte());语句中 getByte()所得到的数据,也就是说他们的数据时一致的。那么反过来,我们要得到String ,所以new String(data);

 


输入 /**回车 然后可以输入备注

 

然后对它进行单元测试

首先,引入单元测试的环境 即把安卓单元测试依赖库(相当于引入类库)引入进来


在application节点中添加 <uses-library android:name="android.test.runner">


然后再在mainfest里添加
<instrumentation android:name="android.test.InstrumentationTestRunner"
android:targetPackage="cn.itcast.junit"android:label="Test for my app"/>

然后修改一下 targetPackage

接下来 创建单元测试用例 新建一个class 把它放在test包里,让它进程AndroidTestCase这个类,然后再写测试方法 ,然后把被测试类的对象给它new出来 然后取得上下文对象

private static final String TAG = "FileServiceTest";
public void testRead() throws Throwable{
 FileService service = new FileService(this.getContext);
 String result = service.read("itcast.txt");
 Log.i(TAG,result);

}

添加日志过滤器

/**
*关于上下文的理解
*/

最简单的理解: 
一个APK进程只有一个Context: 这个Context就是ApplicationContext,从Context继承过来。

ApplicationContext可以看做是针对整个系统的全局处理接口,因为: 
它负责和系统服务打交道 
RPC通信由他通过那些XXXServiceManager和XXXService来处理。

其他一些模块,比如Activity……


关于上下文的百度解释

android开发中的几种上下文有什么区别,他们是否相同
2012-11-16 10:54提问者: wbdwsqwwn |浏览次数:127次
比如context     Activity.this , getApplicationContext  这几种上下文分别的用法.还有为什么在new ProgressDialog(Context context)的时候,传的上下文不能用getApplicationContext ,运行时会报异常,传this或者

Activity.this就可以.

满意回答
2012-11-16 11:08
context出现通常作为一个类。而Activity.this是作为一个具体的对象。并且context一般是作为参数传递的。Activity.this就是context的一个具体。就好比说,动物和狗的关系。而getApplicationContext 看名字也知道了

,是得到整个应用的context。你现在在一个具体的activity中传他,代码怎么怎么知道你想在哪个activity中创建dialog啊。这不是为难它吗?
追问
那每个activity的上下文和getApplicationContext是不是一个上下文,一个应用中有几个上下文,谢谢
回答
每个activity都有自己的上下文啊。一个应用就只能有一个上下文啦。

 

 

 

Context字面意思是上下文,位于framework package的android.content.Context中,其实该类为LONG型,类似Win32中的Handle句柄。很多方法需要通过 Context才能识别调用者的实例:比如说Toast的第一个参数就是

Context,一般在Activity中我们直接用this代替,代表调用者的实例为Activity,而到了一个button的onClick(View view)等方法时,我们用this时就会报错,所以我们可能使用ActivityName.this来解决,主要原因是因为

实现Context的类主要有Android特有的几个模型,Activity以及Service。

Context提供了关于应用环境全局信息的接口。它是一个抽象类,它的执行被Android系统所提供。它允许获取以应用为特征的资源和类型。同时启动应用级的操作,如启动Activity,broadcasting和接收intents。


不过我看过的最简单的理解: 
一个APK进程只有一个Context: 这个Context就是ApplicationContext,从Context继承过来。

ApplicationContext可以看做是针对整个系统的全局处理接口,因为: 
它负责和系统服务打交道 
RPC通信由他通过那些XXXServiceManager和XXXService来处理。

其他一些模块,比如Activity……

 

 

 

 

 

原创粉丝点击