美文网首页Android知识Android开发经验谈
一些小知识(不定时更新)

一些小知识(不定时更新)

作者: NapleC | 来源:发表于2016-03-17 15:22 被阅读257次

    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等)

    android sdk api的层次结构

    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 

    结语:如果不明白可以私信。

    相关文章

      网友评论

        本文标题:一些小知识(不定时更新)

        本文链接:https://www.haomeiwen.com/subject/kgdsqttx.html