Byron's log
‹‹ back
Android 2.X 代码的战斗笔记
Create Time : 2011-06-08 11:06:38
Modify Time : 2011-06-09 09:36:26

关于R.java文件/关于资源id

  1. R.java文件是由Android自行维护的,通常它只作为查看来使用
  2. 在Android开发中,所谓的id,实质上都是int类型.这和我们其它的脚本有区别,因为Android开发中,不存在字面量的id。而为了让id成为唯一性。在布局中应用时产生了@+id/google这样的写法。它的作用是生成一个可供R.id.google引用的唯一int类型。在行为上,有点类似(创建并引用)
@[+][package:]type:name ?[package:][type:]name @[package:]type/name可的name部分是提供给资源的名称 没有指定package(包),则type/name对将根据本地资源和应用程序的本地R.java包进行解析。 如果指定了android:type/name,将使用包android来解析引用ID具体是通过android.R.java文件 完成 。可以使用任何java包名称做为package 很多资源定义都如这样的形式 @+id/text1 +表示如果没有定义,就创建并引用。 这里有一编很棒的关于Android theme与style的文章 有时候对xml内的资源作修改以后,发现ant debug编译出来的apk在安装调试后出错! 你可以试试 #ant clean // 清空缓存 #ant debug // 重新编译

Adapter 你想说什么?

这些年,我在作一些web应用的时候,基本上没有使用过adapter这个东西,包括在actionscript的应用中,只是简单的使用adapter。而android不同了,这个延伸至java的数据填充模式让我必须深入的了解它。我会从一个脚本开发者的角度进行不确定的断言,以方便脚本开发者对于Adapter(适配器)进行了解。 在script世界里数据渲染是怎样的? 数据---->视图---->浏览器 在java世界里的数据渲染是怎样的? 数据---->Adapter---->布局(视图)---->浏览器 下面是一段代码:
data = new ArrayList<Hashtable<String,Object>>();
for(int i=0;i<readtype.length;i++){
	Hashtable<String,Object> record = new Hashtable<String,Object>();
	record.put("type",readtype[i]);
	record.put("count",i);
	data.add(record);
}
adapter = new SimpleAdapter(this,
							data,
							R.layout.list,
							new String[]{"type","count"},
							new int[]{R.id.txtType,R.id.txtCount});
this.setListAdapter(adapter);
分析一下: adapter其实就是一个(断言)数据对齐的工具。适配器,就像是插座的插口有很多,我们想用二插头接三插口,好吧,适配器就是干这个事儿的。 PS:你可能需要了解一下关于java泛型 为什么会出现这种情况? 答案是项目庞大吧(个人猜测)。在Java开发中,所谓的Layout相当于View。在每一个View设计中可能会多次出现相同字段,但是不同的数据渲染。比如id字段有时要显示“001”有时要显示“AB901”,Java觉得要写多个View是让人不开心的事,View只要一个就够了,构建一个Adapter(适配器),来使二插口接三插头吧。 适配器就像是数据对齐的过滤通道,当然它的优势还是需要我们慢慢发掘。。

数据存储,你闹哪样啊?

关于数据存储的大体分类请看这篇 深入Android【八】—— Activity间数据传输 文章,选择项目应用的存储方式是重要的。另一个重要的原因是因为Android的数据是私有化的,所以,数据共享也是这百花齐放的灵活的妖孽啊。

网络传输(GET)

  1. 创建一个URL对象
  2. 创建一个URLConnection对象
  3. 创建一个InputStream对象(选择一种读取方式)
  4. 设置InputStream缓冲模式(具说这是Java的特性之一,这让我们这些玩python和C的人情何以堪啊)
  5. 将数据流存入字节数组(ByteArrayBuffer)
  6. 最后你(可能)还需要对内容进行编码转换。
我勒个擦,以上就是JAVA在模拟一个HTTP GET的请求。当然,你可以说它更底层,更灵活,更强健一些。可是在实际应用中,很少用到这些分支,这就是过度封装啊。

网络传输(POST)

你是否记得PHP这种非强类型数组可以有字面量下标(相同于python中的字典),而在而在数组Value部分,你可以是任意类型。可是在JAVA世界里只能用泛型来解决,所以你要创建一个“值对”的推数据,就需要用HashMap进行封装。
  1. 创建推送数据(HashMap)
  2. 创建一个http client客户端 (org.apache.http.impl.client.DefaultHttpClient)
  3. 创建一个http post对象 (org.apache.http.client.methods.HttpPost)
  4. 将HashMap推送数据转化成POST请求内容(org.apache.http.message.BasicNameValuePair)
  5. 再将转化好的数据进行网络转义(类似urlencode的特殊字符转义,org.apache.http.client.entity.UrlEncodedFormEntity)
  6. 将那个该死的数据放放过HTTP请求对象吧httppost.setEntity()
  7. 再将http post对象交给httpclient执行了
  8. httpclient执行会返回一个response对象,你需要对response获取一个实体(HttpEntity)
  9. 再从HttpEntity中获得实际内容(getContent)
  10. 你以为getContent的内容就可以直接用了?错了!它还是Stream,你需要转化它(convertStreamToString()
  11. 我勒个擦,终于可以使用返回的文体了。
其实我们不能怪JAVA,因为通常JAVA操作的实际连接都是比较底层的socket,相对于socket HTTP POST本身就是一种封装。

ImageView 控制

<ImageView
		android:maxWidth="32dp"
		android:maxHeight="32dp"
		android:adjustViewBounds="true"
		android:layout_width="wrap_content"
		android:layout_height="wrap_content"
		android:src="@drawable/bg_key"/>