不知不觉一个月又过去了,中级部分已经学习完毕,给大家讲讲学习心得,希望对新人有所帮助,中级部分主要是一些控件的设置,以及实现一些控件的功能。

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”