1.AsyncTask使用在哪些场景?它的缺陷是什么?如何解决?
AsyncTask 运用的场景就是我们需要进行一些耗时的操作,耗时操作完成后更新主线程,或者在操作过程中对主线程的UI进行更新。
缺陷:AsyncTask中维护着一个长度为128的线程池,同时可以执行5个工作线程,还有一个缓冲队列,当线程池中已有128个线程,缓冲队列已满时,如果
此时向线程提交任务,将会抛出RejectedExecutionException。
解决:由一个控制线程来处理AsyncTask的调用判断线程池是否满了,如果满了则线程睡眠否则请求AsyncTask继续处理。
2.android sdk api的层次结构
一、系统级:android.accounts android.app
1、OS 相关
2、VM 相关
二、程序框架
如果非要套MVC的话 m是content v 是各种view C是activity
三、系统内置的服务(windows中以dll形式提供给程序员)
1、多媒体
2、网络
2.1 协议
2.1.1 链路层
2.1.2 传输层
2.1.3 应用层
2.2 服务
3、数据库
4、触控
5、字体渲染
6、语音识别
7、XML解析
8、壁纸管理(windows里面应该是桌面)
四、其他
android.util(IO、容器类、Json、数据编码、XML等)
3Intent在传递数据时是有大小限制的,这里官方并未详细说明,不过通过实验的方法可以测出数据应该被限制在1MB之内(1024KB),测试采用的是传递Bitmap的方法,发现当图片大小超过1024(准确地说是1020左右)的时候,程序就会出现闪退、停止运行等异常(不同的手机反应不同),因此可以判断Intent的传输容量在1MB之内。
有兴趣可以看下:intent传递数据时,数据大小的限制问题
3.一个安卓程序 至少有几个线程
UI线程即用户交互线程,用来处理用户消息和界面绘制;
这里注意:为了实现AIDL 会多两个Binder线程。
每个Binder对象对应一个线程;在ActivityThread中会创建ApplicationThread,他们都是继承Binder,所以这里是启动两个线程;
所以最少应该是3个线程
4. new View.OnClickListener()
2016-04-26
一个入门级的问题 new View.OnClickListener() 为什么可以实例化,
个人回答是 使用了匿名内部类方法实现了这个接口。其中的方法已经在{}里实现了
ps:为什么前面要加个View呢,原因就是后面的OnClickListener是个View类内部的接口,如果直接使用是找不到这个接口的。
5.scrollview 嵌套 listview
2016/5/6
这是个填不完的坑,不需要问为什么会有这样的ui。简单说下问题 scrollview里面嵌套了一个listview 现在的情况就是进到这个界面的时候看到的不是最上面
首先说第一个方法:
初始化的时候listview先隐藏,得到数据的时候显示(在自定义scrollview也是有效的)
第二个方法 在listview绘制完成之后使用
mScrollView.smoothScrollTo(0,20);
如无效, 在代码里去掉listview的焦点 lv.setFocusable(false),再试下就可以了;
最后说一句这种嵌套以后还会遇到更多问题,只要改需求就是坑
2016/09/21更新
6.Retrofit 使用DELETE带body 请求
下面是Retrofit作者原话
Retrofit's @DELETE doesn't support a request body because the HTTP spec says there shouldn't be one. If you need to use a body with the DELETE method you will need to create your own HTTP annotation as mentioned above.
但一定要这样做呢,那下面的方法就是你需要的
把 @DELETE("my/path") 替换为
@HTTP(method = "DELETE", path = "/your/path", hasBody = true)
为什么会有这种需求呢,因为有个需求是使用delete方式将数据以data包传给后台(类似post传参),但是delete参数必须像get那样拼接在url上,这问题就来了。
用过Retrofit的知道,有一个 @body 使用如下:
1. 在请求的地方
@BodyMsgIds msgIds
class MsgIds{
Stringids;
public MsgIds(String ids) {
this.ids= ids;
}
public String getIds() {
return ids;
}
public void setIds(String ids) {
this.ids= ids;
}
}
2. 在调用的地方
MsgIds msgIds =new MsgIds(yourvalue);
传入 msgIds
结语:如果不明白可以私信。
网友评论