代码操作UI
- 从Layout资源句载控件,使用LayoutInflater实例,还有类似的MenuInflater,所以看到inflater这个单词,就应该想到是用于句载资源的;
RecyclerView
- 是一个显示列表的控件
- 它与ListView的区别是:它的效率高,定制性强;
- 让RecyclerView显示数据,需要:1)为它设置Adapter;2)为它设置LayoutManager。
- Adapter用于为RecylclerView提供数据;
- LayoutManager决定RecylclerView中Item的摆放方式;
- RecyclerView调用Adpater的方法获取数据,比如获取需要显示多少条,获取每条所用的控件;
- Adapter::onCreateViewHolder()中创建Item控件并返回
- Adapter::onBindViewHolder()中绑定数据与控件,使得每一条能显示不同的数据;
- Adapter::getItemCount()返回显示多少条数据;
- 在Item之间显示分隔的最简单的方式是使用CardView;
- 向RecyclerView添加Item:先在后台集合中添加元素,再通知RecyclerView刷新数据;
- 从RecyclerView删除Item:先在后台集合中删除元素,再通知RecyclerView刷新数据;
- 显示不同Layout的Item:需要告诉RecyclerView,各行对应什么样的Layout,之后在创建行View和绑定行数据时,都需要判断是哪种layout。每种layout对应一个ViewHolder,所以要创建多个ViewHolder类,并且它们都从同一个基类派生,此基类要用作Adapter类的范型实参;
优化
- 将查找行中要绑定的子控件的动作放在ViewHolder的构造方法中,保证了findView操作只执行一次,这也体现出了ViewHolder的作用;
- ViewHolder的作用有2:1)减少findView操作;2)提供了获取ViewHolder所在行序号的方法;
响应Item选择
Menu
- Android中有多种菜单:Option Menu、Context Menu、Pop Menu;
- 在ActionBar上显示的菜单叫做Option Menu(选项菜单)
- 要显示Option Menu,重写Activity的onCreateOptionsMenu()方法,在其中创建Menu对象;
- 响应菜单项的选择,需重写Activity的方法;
Activity导航
- Activity正向传递数据:通过Intent,调用Intent的putExtra()方法将数据放在Intent中;
- Actvity取得Intent中的数据:先取得启动自己的Intent对象,然后调用其getXXXExtra()方法取得相应的数据;
- Activity返回数据:也是通过Intent携带数据,在关闭前调用方法setResult()设置Intent即可;
9-pitch图
- 它是栅格图;
- 它可以是任何图像格式,比如png,jpg,bmp等;
- 它的名字必须以xxx.9.png,xxx.9.jpg这种形式
- 创建它时,需要为它的上下左右四边留出一个像素的空,在这些空中用黑线标出可以拉申的地方;
多线程
- 进程:进程就是程序在内容中的状态;
- 代码执行时的状态叫线程,线程处于进程中,每个进程至少有一个线程;
- 线程代表动态的东西,进程代表静态的东西;
- 任何代码的执行,必然处于某个线程中;
- UI线程就是主线程;
- 操作UI必须在UI线程中;
- 同步执行:前一条指令执行完毕才能执行下一条;
- 异步执行:后面的指令不需要等待前面的执行完毕才执行,两条指令的调用时机在时序上没有相关性;
- 单线程中也可以做到异步执行;
- 多线程之间可以做到同步执行;
- 在App中开线程的主要目的是为了避免在UI线程中执行长时间的操作而造成界面假死;
- 如何在其它线程中操作UI对象?把要操作UI的代码“扔”到主线程中执行,需要使用handler,有两种方式,1是把要执行的代码封装到Rannable中,扔到主线程中,2是使用消息处理的方式,此时向主线程中发出的是消息;
- 如何停止线程? thread.interrupt()方法可以强制停止线程,但是这会导致线程非正常退出。正确的做法是:等待线程止常退出,但是要想办法使线程尽快退出;
#异步任务
- 是一个类:AsyncTask;
- 使用它之后,我们不用开后台线程;
- 使用异步任务,需从AsyncTask派生子类,重写几个方法;
网络通讯
- ip地址与域名
- TCP与UDP
HTTP协议
- 基于TCP;
- AndroidApp中也可以像浏览器一样显示网页,这需要用控件WebView;
- 网络访需要注意两点:1是开线程,2是声明网络访问权限;
- AndroidQ下的 HTTP API 默入不允许以非安全的HTTP访问Web服务端,要想开放这个权限,需要为Manifest文件中的Application元素添句属性:android:usesCleartextTraffic=“true”;
- 在虚拟机中访问主机,其IP为:10.0.2.2;
- 解析XML有三种API,对应三种模式,最常用的是两种:DOM模式和SAX模式;DOM简单,但是占用内存多,SAX复杂,占用内存少,但是SAX最适于不用解析全部XML数据的情况。
OkHttp
- 最常用的第三方HTTP通讯库;
- HTTP上传文件,需打包multipart/form-data类型的HTTP包,这种包的Body中可以同时包含文本与二进制数据(即文件);
Gson
- Google自家的Json处理库;
- 利用反射创建对象;
- 不要求对象的类实现Setter,而必须保证字段名与Json字符串的key相同;
Retrofit
- 是一个Http网络通讯库,它基于OkHttp库;
- 基于代理和反射,自动为我们创建网络通讯逻辑,他支持注解;
- 使用它的方式:创建一个接口,在接口中定义获取网络数据的方法,利用注解指明这个方法的一些网络参数;创建Retrofit对象,指定主机地址,指定数据转换器;利用Retorift创建出接口的代理类实例,利用这个实例调用网络访问方法。如果设置了正确的转换器,那么Json可以直接转换成类的实例;
- Json转实例,需要添架Gson convert库的依赖:implementation ‘com.squareup.retrofit2:converter-gson:2.5.0’
ContentProvier
- 内容提供者:ContentProvider,是Android中的四大组件之一。它用于在各组件和App之间共享数据;它并不是一种数据存储方式,它的主要工作是将某些数据以关系型数据库表的形式提供给访问者。
- 要想通过内容提供者获取数据,需要使用内容解决器-ContentResolver。
- 内容以提供者要求以Uri是形式指向要访问的内容比如:content://xxxxxxxxx/aa/bb
Service
- 专用于后台处理,它没有界面,它能保证不包含可见Activity的进程在后台长期存活。
- Service在系统中是单例,不论start或bind几次,它只有一个实例。
- Service有本地Service和远程Service之分,本地Service与启动它的Activity处于同一进程的同一线程内,也就是说,此种Servcie在UI线程中运行,要在service中执行耗时的操作,应该开后台线程。
版权声明:本文为nkmnkm原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。