不知不觉一个月又过去了,中级部分已经学习完毕,给大家讲讲学习心得,希望对新人有所帮助,中级部分主要是一些控件的设置,以及实现一些控件的功能。
Android通知系统,Tostask 比较常用;进度条progressBar,用于下载和音乐播放器以及用户等待时间等;
Listview常常用到的:
功能:用来批量展示信息,以垂直列表形式显示所有列表项
listview是一个组合控件
基本控件:内容和控件在一个对象里面
组合控件:内容和控件不在同一个对象里面
listview
listview本身这个控件: 框跟行分隔
Adapter(适配器): 所有行内容
listview实现步骤:
1、在布局文件上面设置一个listview控制
2、创建一个listview的行布局(通常用RelativeLayout)
3、在Activity里面查找到listview控件对象。
4、为listview控件对象设置一个适配器(对象.setAdapter(适配器对象))
5、创建一个适配器对象(通常用的是BaseAdapter)
BaseAdapter adapter = new BaseAdapter() {
//设置listview行布局和内容
public View getView(int position, View convertView, ViewGroup parent) {
//得到一个布局转换器
LayoutInflater layoutInflater = getLayoutInflater();
//通过布局转换器把行布局文件转换成可用的布局对象
RelativeLayout inflate =
(RelativeLayout) layoutInflater.inflate(R.layout.list_item, null);
//查找布局对象里面存放的控件
TextView textView = (TextView) inflate.findViewById(R.id.textView1);
//获取行号对应的信息内容
String text = arrayList.get(position);
textView.setText(text );
return inflate;
}
//决定listview的行数
public int getCount() {
return arrayList.size();
}
};
注意:getView()方法调用:界面上每出现一行就调用一次getview();
getCount() 第一次调用在getview之前
注意:listview的高度不能设置成wrap_content。可以指定高度XXdp或者设置长match_praent
线程也很重要,主要用到AsyncTask (异步加载):
好处:1、不需要我们自己创建线程,降低难度
2、线程池:复用了Thread对象,提高了性能
缺点:使用步骤稍多,代码可读性差一点
使用步骤:
1、创建一个类继承AsyncTask<xxx,xxx,xxx>
三个泛型参数: 1、决定了task.execute(xxx)的参数类型
以及doinbackground()方法的参数类型
2、决定了doinbackground()里面调用publishProgress(xx)的参数类型
以及onProgressUpdate()方法传入的参数类型
3、决定了doinbackground()方法的返回值类型
以及onPostExecute()的参数类型
2、重写doinbackground()方法
耗时操作放在这个方法里面执行(系统new的子线程)
return(执行耗时操作之后返回一个值给main线程)
3、重写onPostExecute()
调用时间:doinbackground()执行完后,返回一个值的时候,onPostExecute()才被调用
接收doinbackground返回值。
所在线程:main线程
4、启动异步任务
a、XXXAsyncTask task = new XXXAsyncTask();创建AsyncTask对象
b、task.execute(xxxx) 启动异步加载
中间过程如何发送消息到主线程
1、在doinbackground方法里面调用:publishProgress()
2、重写onProgressUpdata(),接收数据,并更新UI(main线程里面)
onPreExecute()方法是在doinbackground之前运行
AsyncTask内部方法的先后顺序
onPreExecute() ————》doinbackground()——————》onPostExecute()
调用 publishProgress() ————————》onProgressUpdata()
还有就是数据的读取跟解析 目前用的最多就是JSON。
网络传输中,数据的组织方式:
xml,json,http
xml 可扩展的标记语言
跨平台、依赖于内容的技术,简单的数据存储语言。
解析xml文件的方式:
三种: sax dom pull
sax解析器:
一种解析速度快,占用内存少的xml解析器。
事件驱动,不会把所有文件加载到内存
startDocument()
当遇到文件开头的时候会触发这个方法
startElement(String uri, String localName,
String qName, Attributes attributes)
当读到一个元素节点开始的时候会触发这个方法。
localName:不带前缀的标签名
attributes:带有属性和内容
endElement()
当读到一个元素节点结束的时候会触发这个方法。
characters()
读取到文本节点的时候会触发这个方法
endDocument()
当遇到文件结束的时候会触发这个方法
dom解析器:
一次性读取文件所有内容,性能比较差。适合服务端编程。
数据以树状结构存在。
xmlpull
类似sax(pull不会自动读取完整的文件)
适应嵌入式设备,占用内存少,API比较简单
assets文件夹:
1、assets文件下的文件在打包后会原封不动的保存在apk包里面,不会被编译成二进制。
2、assets文件下的文件不会被映射到R文件,访问的时候需要AssetsManager类
3、aseets文件下可以有目录结构,也就是说在aseets文件下可以再创建新的文件夹
raw
json格式:
相对于xml格式,更节省空间。
json对象:{"key1":value,"key2":value}
1、大括号开始结束{}
2、内容部分每条数据都是以“,”分隔
3、每条数据都是以键值对形式构成的,key必须是字符串;
值可以是:string、double、int、long、boolean,
json对象,json数组。
例如:{"name":"Tom","sex":"man","age":20,"id":"350767678676787"}
注:json是可以嵌套的。
jsonArray
[
{"name":"Tom","sex":"man","age":20,"id":"350767678676787"},
{"name":"Tom","sex":"man","age":20,"id":"350767678676787"}
]
注意:json数据文件要保存成“utf-8 无BOM”