1.java.lang.IllegalStateException: Cannot add header view to list
listciwe在设置头部View爆出bug,调用addHeaderView和setAdapter的顺序。
在设置headview之前调用setAdapter(null),之后重新设置adapter。
ListAdapter adapter = listView.getAdapter();
listView.setAdapter(null);
listView.addHeaderView(headerView);
listView.setAdapter(adapter);
2.EventBus事件订阅机制,post消息之后如何回调activity的事件触发方法
通过反射查找订阅者类中的onEvent函数:
- EventBus基本实现原理
- EventCenter持有EventBus且是单例,bindContainerAndHandler注册订阅者事件,EventHandlerManager管理所有订阅者事件;
- EventBus线程模式
- PostThread
- MainThread
- BackgroundThread
- Async
- EventBus存储事件
- Map<calss<?>,CopyWriteArrayList<subscription>> ,存储event->subscription,同一事件对应的订阅者;
- Map<Object,List<?>> ,subscription->events,同一类型订阅者的集合;
3.ImageLoder缓存机制
loadImage可以直接下载图片,displayImage显示图片
- 缓存类型
- FIFOLimitedMemoryCache
- LimitedAgeMemoryCache 等
- 缓存机制
- FIFOCache类使用LinkList双链表做为存储bitmap容器(imageloader同时也增加了对bitmap对应url的键值存储,以及bitmap大小的限制),主要操作都是在MemoryCache类put remove内进行筛选操作;
- LimitAgeCoach,使用HashMap<String ,Long>,存储bitmap时间;
- ImageLoad加载流程
- 内存、本地、网络加载
4.ultra-ptr添加上滑加载更多
增加loadmore加载更多,在listiew中监听scroll,在onScroll中根据cell item个数判断是否到达底部(firstVisibleItem + visibleItemCount >= totalItemCount - 1),在onScrollStateChanged中确定执行loadmore操作;
5.java四种引用
- 强引用
- 声明变量即强应用,String s = new String();
- 弱引用
- 通过使用WeakReference
- 虚引用
- 软引用
6.handler的机制
7.asyncTask的机制
private class MyTask extends AsyncTask<String, Integer, String> {
//onPreExecute方法用于在执行后台任务前做一些UI操作
@Override
protected void onPreExecute() {
}
//doInBackground方法内部执行后台任务,不可在此方法内修改UI
@Override
protected String doInBackground(String... params) {
}
//onProgressUpdate方法用于更新进度信息
@Override
protected void onProgressUpdate(Integer... progresses) {
}
//onPostExecute方法用于在执行完后台任务后更新UI,显示结果
@Override
protected void onPostExecute(String result) {
}
//onCancelled方法用于在取消执行中的任务时更改UI
@Override
protected void onCancelled() {
}
}
8.jvm分区,GC
JAVA的JVM的内存可分为3个区(常用的,一共有6个):堆(heap)、栈(stack)和方法区(method);
- 堆区:存储的全部是对象,每个对象都包含一个与之对应的class的信息;
- 栈区:每个线程包含一个栈区,栈中只保存原始类型数据和对象和对象引用(不是对象),对象都存放在堆区中
- 方法区:又叫静态区,方法区包含所有的class和static变量
9.volatile与synchronized的区别
volatile本质是在告诉jvm当前变量在寄存器(工作内存)中的值是不确定的,需要从主存中读取;synchronized则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住。
10.Runnable和Callable的区别是
(1)Callable规定的方法是call(),Runnable规定的方法是run().
(2)Callable的任务执行后可返回值,而Runnable的任务是不能返回值得
(3)call方法可以抛出异常,run方法不可以
11.Android的存储方式
1 使用SharedPreferences存储数据
2 文件存储数据
3 SQLite数据库存储数据
4 使用ContentProvider存储数据
5 网络存储数据