本文主要是介绍业余收集,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Face to Face:JAVA:
1. 8种基本类型: 整形:int,short,long,byte; 浮点型:float,double; 布尔型:boolean; 字符型:char
2. 接口和抽像类。
1. Activity 生命周期
oncreate -> onrestart -> onstart -> onresume -> onpause -> onstop -> ondestroy
1. A Activity trun to B Activity:
A.onPause -> B.onCreate -> B.onstart -> B.onResume -> A.stop
2. Android SDK各版本特点,举例。
3. DispatchKeyEvent 事件分发流程
---server side: 1. InputReader.cpp 2.InputDispatcher.cpp
---Client side: NativeInputQueue:handlerReceiveCallback() ->InputQueue.dispatchKeyEvent -> ViewRootImpl.deliverKeyEvent ->
1. mView.dispatchKeyEvent(event); 将事件派发到View视图。因为mView就是一个DecorView,所以就是调用DecorView的dispatchKeyEvent的方法。
4. 源码那部分写的比较好,举例。
5. 细谈编程 哲学:
程序=数据结构+算法
哲学=人生观+方法论
事物是相通而又区别的,我们既要看到差异,也要看到共“通”,不能以偏盖全,只见树木不见森林。也不能只讲宏观而不讲实际的应用,所有的理论或者方法都要有实际的效用才有他存在的真正价值。故而我个人觉得,在学习中,在编程中,在生活中,都要从整体上把握,从细微处入手。
1. 《The Art of Readable Code》中告诉我们,评价一段代码的质量的最佳标准是可读性,即别人理解代码意图所需要的时间。
不管你是团队开发,还是一个人单干,只要项目还在运作,代码总是要有人来维护的。如果有一天你不在或者离开了,别人应该能很轻松的看懂你的代码,而不是猜来猜去,最后还要来问你,甚至弃用整段代码重新再写。作为一个负责任的开发者,应该尊重自己的劳动成果,也尊重别人的时间。
1.用常量代替魔术数;
2.使用富含信息的类名、变量名和函数名
3.在注释中说明一段代码存在的原因,而不是行为
4.减少逻辑层次
5.缩小函数体
6.将重复的代码提炼成子函数
7.用循环减少重复
DRY: Don't Repeat Yourself.(不要总是用相同代码解决相同问题)
KISS: Keep It Simple, Stupid.(让代码简单直接)
重构(简单来说就是重写使之更加合理)。
面向对象的语言如Java都有着极为丰富的设计模式,这些设计模式繁复多样。四人帮写得那个经典著作《设计模式》中就列出了十几种模式。但是仔细研究观察会发现,不论是哪种模式,都是这三者的排列组合和深化,都脱不了这三种的基本元素,只不过有的更侧重于数据流,有的更侧重于过程流,有的两者并重,有的强调接口与实现(类:数据和过程)的关系等等。
所以掌握各种设计模式千万要杜绝死记硬背,掌握最常见的几种就已经足以。将这些模式经常融入到软件设计中,你不需要知道它叫什么名字。另外将这些模式混合使用也很重要,往往一种模式并不能完全解决某种问题,活学活用才是关键。而掌握这些设计模式的思想精髓,即面向对象三种的实体的关系就是关键。或许你能创造自己的模式来。
1. TCP wait timer
2. c++ outmemony
3. handler send message 机制、
与Handle工作的几个组件Looper、MessageQueue各自的作用:
1.Handler:它把消息发送给Looper管理的MessageQueue,并负责处理Looper分给它的消息
2.MessageQueue:采用先进先出的方式来管理Message 3.Looper:每个线程只有一个Looper,比如UI线程中,系统会默认的初始化一个Looper对象,它负责管理MessageQueue,不断的从MessageQueue中取消息,并将相对应的消息分给Handler处理
/20150120:
1. 进程和线程
2. JAVA 线程synchronized方法和synchronized同步代码块的区别:
synchronized同步代码块只是锁定了该代码块,代码块外面的代码还是可以被访问的。
synchronized方法是粗粒度的并发控制,某一个时刻只能有一个线程执行该synchronized方法。
synchronized同步代码块是细粒度的并发控制,只会将块中的代码同步,代码块之外的代码可以被其他线程同时访问。
. synchronized 块:通过 synchronized关键字来声明synchronized 块。语法如下:
synchronized(syncObject) {
//允许访问控制的代码
}
??synchronized 块是这样一个代码块,其中的代码必须获得对象 syncObject (如前所述,可以是类实例或类)的锁方能执行,具体机制同前所述。由于可以针对任意代码块,且可任意指定上锁的对象,故灵活性较高。
对synchronized(this)的一些理解
一、当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。
二、然而,当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的非synchronized(this)同步代码块。
三、尤其关键的是,当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对object中所有其它synchronized(this)同步代码块的访问将被阻塞。
四、第三个例子同样适用其它同步代码块。也就是说,当一个线程访问object的一个synchronized(this)同步代码块时,它就获得了这个object的对象锁。结果,其它线程对该object对象所有同步代码部分的访问都被暂时阻塞。
3. THREAD & RUMMBER 线程
3. ANDROID ACTIVITY & SEVICE 生命周期
4. 大图片的优化处理 LruCache
5. ANR
6. ListView 的加载优化
7. android 开发如何做内存优化; 在android中,有一个相对来说还不错的工具,可以用来监测内存是否存在泄露情况:DDMS—Heap,Android中内存泄露定位Mat(memory analyzer tools)
1.注册没取消造成的内存泄露;
2.集合中对象没清理造成的内存泄露;
3.资源对象没关闭造成的内存泄露;资源性对象比如(Cursor,File文件等)
4. Bitmap没调用recycle()
5. 构造Adapter时,没有使用缓存的 convertView
6. 尽量对bitmap 图减少采样;options.inSampleSize = 2;使用RGB_565: Bitmap.Config.RGB_565;//(2Byte)
7. 尽量使用9path图片
8.巧妙的运用软引用(SoftRefrence)
有些时候,我们使用Bitmap后没有保留对它的引用,因此就无法调用Recycle函数。这时候巧妙的运用软引用,可以使Bitmap在内存快不足时得到有效的释放。
8.java对象的强引用,软引用,弱引用和虚引用
1.强引用-大部分引用实际上都是强引用
垃圾回收器绝不会回收它。当内存空 间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足问题
2.软引用(SoftReference)如果一个对象只具有软引用,那就类似于可有可物的生活用品。如果内存空间足够,垃圾回收器就不会回收它,如果内存空间不足了,就会回 收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。软引用可用来实现内存敏感的高速缓存。
软引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被垃圾回收,JAVA虚拟机就会把这个软引用加入到与之关联的引用队列中。
3.弱引用(WeakReference)
如果一个对象只具有弱引用,那就类似于可有可物的生活用品。弱引用与软引用的区别在于:只具有弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它 所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。不过,由于垃圾回收器是一个优先级很低的线程, 因此不一定会很快发现那些只具有弱引用的对象。
弱引用可以和一个引用队列(ReferenceQueue)联合使用,如果弱引用所引用的对象被垃圾回收,Java虚拟机就会把这个弱引用加入到与之关联的引用队列中。
4.虚引用(PhantomReference) "虚引用"顾名思义,就是形同虚设,与其他几种引用都不同,虚引用并不会决定对象的生命周期。如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收。
特别注意,在世纪程序设计中一般很少使用弱引用与虚引用,使用软用的情况较多,这是因为软引用可以加速JVM对垃圾内存的回收速度,可以维护系统的运行安全,防止内存溢出(OutOfMemory)等问题的产生。
6,请解释下Android程序运行时权限与文件系统权限的区别。
apk程序是运行在虚拟机上的,对应的是Android独特的权限机制,只有体现到文件系统上时才使用linux的权限设置。
android系统有的权限是基于签名的。
7、什么是ANR 如何避免它?
答:ANR:Application Not Responding,5秒在Android中,活动管理器和窗口管理器这两个系统服务负责监视应用程序的响应。当出现下列情况时,Android就会显示ANR对话框了:
对输入事件(如按键、触摸屏事件)的响应超过5秒
意向接受器(intentReceiver)超过10秒钟仍未执行完毕
Android应用程序完全运行在一个独立的线程中(例如main)。这就意味着,任何在主线程中运行的,需要消耗大量时间的操作都会引发ANR。因为此时,你的应用程序已经没有机会去响应输入事件和意向广播(Intent broadcast)。
因此,任何运行在主线程中的方法,都要尽可能的只做少量的工作。特别是活动生命周期中的重要方法如onCreate()和 onResume()等更应如此。潜在的比较耗时的操作,如访问网络和数据库;或者是开销很大的计算,比如改变位图的大小,需要在一个单独的子线程中完成 (或者是使用异步请求,如数据库操作)。但这并不意味着你的主线程需要进入阻塞状态已等待子线程结束 — 也不需要调用Therad.wait()或者Thread.sleep()方法。取而代之的是,主线程为子线程提供一个句柄(Handler),让子线程 在即将结束的时候调用它(xing:可以参看Snake的例子,这种方法与以前我们所接触的有所不同)。使用这种方法涉及你的应用程序,能够保证你的程序 对输入保持良好的响应,从而避免因为输入事件超过5秒钟不被处理而产生的ANR。这种实践需要应用到所有显示用户界面的线程,因为他们都面临着同样的超时 问题。
7.横竖屏切换时候activity的生命周期?
1、不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次
2、设置Activity的android:configChanges=”orientation”时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次
3、设置Activity的android:configChanges=”orientation|keyboardHidden”时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法
8.android 中有哪几种解析xml的类?官方推荐哪种?以及它们的原理和区别。
XML解析主要有三种方式,SAX、DOM、PULL。常规在PC上开发我们使用Dom相对轻松些,但一些性能敏感的数据库或手机上还是主要采用SAX方 式,SAX读取是单向的,优点:不占内存空间、解析属性方便,但缺点就是对于套嵌多个分支来说处理不是很方便。而DOM方式会把整个XML文件加载到内存 中去,这里Android开发网提醒大家该方法在查找方面可以和XPath很好的结合如果数据量不是很大推荐使用,而PULL常常用在J2ME对于节点处 理比较好,类似SAX方式,同样很节省内存,在J2ME中我们经常使用的KXML库来解析。
9,NDK是什么
NDK是一些列工具的集合,
NDK提供了一系列的工具,帮助开发者迅速的开发C/C++的动态库,并能自动将so和java 应用打成apk包。
NDK集成了交叉编译器,并提供了相应的mk文件和隔离cpu、平台等的差异,开发人员只需简单的修改mk文件就可以创建出so
10, 描述一下android的系统架构
android系统架构分从下往上为linux 内核层、运行库、应用程序框架层、和应用程序层
linuxkernel:负责硬件的驱动程序、网络、电源、系统安全以及内存管理等功能。
11,handler机制的原理
andriod提供了 Handler 和 Looper 来满足线程间的通信。Handler 先进先出原则。Looper类用来管理特定线程内对象之间的消息交换(Message Exchange)。
1)Looper: 一个线程可以产生一个Looper对象,由它来管理此线程里的Message Queue(消息队列)。
2)Handler: 你可以构造Handler对象来与Looper沟通,以便push新消息到Message Queue里;或者接收Looper从Message Queue取出)所送来的消息。
3) Message Queue(消息队列):用来存放线程放入的消息。
4)线程:UI thread 通常就是main thread,而Android启动程序时会替它建立一个Message Queue。
12,android四大组件分别为activity、service、content provider、broadcast receiver。
Activity:
(1)一个Activity通常就是一个单独的屏幕(窗口)。
(2)Activity之间通过Intent进行通信。
(3)android应用中每一个Activity都必须要在AndroidManifest.xml配置文件中声明,否则系统将不识别也不执行该Activity。
Service:
service用于在后台完成用户指定的操作。service分为两种:startService,bindService. startService-其生命周期与启动它的组件无关,并且可以在后台无限期运行,即使启动服务的组件已经被销毁。因此,服务需要在完成任务后调用stopSelf()方法停止,或者由其他组件调用stopService()方法停止。
-----startServicey生命周期: onCreate->onStartCommand->onDestroy
bindService-使用bindService()方法启用服务,调用者与服务绑定在了一起,调用者一旦退出,服务也就终止,大有“不求同时生,必须同时死”的特点。
-----bindService onCreate->onBind->onUnBind->onDestroy
Content provider:
通过ContentResolver类从该内容提供者中获取或存入数据。ContentProvider实现数据共享,不同应用程序间共享数据的唯一方式,
因为android没有提供所有应用共同访问的公共存储区
broadcast receiver:
1.广播接收者的注册有两种方法,分别是程序动态注册和AndroidManifest文件中进行静态注册。
2.动态注册广播接收器特点是当用来注册的Activity关掉后,广播也就失效了。
静态注册无需担忧广播接收器是否被关闭,只要设备是开启状态,广播接收器也是打开着的。也就是说哪怕app本身未启动,该app订阅的广播在触发时也会对它起作用
android笔记--Intent和IntentFilter详解
Intent用于启动Activity, Service, 以及BroadcastReceiver三种组件, 同时还是组件之间通信的重要媒介.
Intent的Action属性:------代表某一种特定的动作
以下是Intent类中预定义的部分action:
ACTION_CALL--目标组件为activity, 代表拨号动作;
ACTION_EDIT--目标组件为activity, 代表向用户显示数据以供其编辑的动作;
ACTION_MAIN--目标组件为activity, 表示作为task中的初始activity启动;
ACTION_BATTERY_LOW--目标组件为broadcastReceiver, 提醒手机电量过低;
ACTION_SCREEN_ON--目标组件为broadcast, 表示开启屏幕.
Intent的Category属性:---用于指定一些目标组件需要满足的额外条件. Intent对象中可以包含任意多个category属性
以下是Intent类中预定义的部分category:
CATEGORY_HOME--表示目标activity必须是一个显示home screen的activity;
CATEGORY_LAUNCHER--表示目标activity可以作为task栈中的初始activity, 常与ACTION_MAIN配合使用;
CATEGORY_GADGET--表示目标activity可以被作为另一个activity的一部分嵌入.
Intent的Data属性: ----data属性指定所操作数据的URI. data经常与action配合使用, 如果action为ACTION_EDIT, data的值应该指明被编辑文档的URI;如果
action为ACTION_CALL, data的值应该是一个以"tel:"开头并在其后附加号码的URI; 如果action为ACTION_VIEW, data的值应该是一个以"http: "开头并在其后附加网址的URI...
Intent的Extra属性:-----通过Intent启动一个component时, 经常需要携带一些额外的数据过去.
携带数据需要调用Intent的putExtra()方法, 该方法存在多个重载方法, 可用于携带基本数据类型及其数组, String类型及其数组, Serializable类型及其数组, Parcelable类型及其数组, Bundle类型等. Serializable和Parcelable类型代表一个可序列化的对象, Bundle与Map类似,可用于存储键值对.
Intent的Flag属性:-----flag属性是一个int值, 用于通知android系统如何启动目标activity,所有的flag都在Intent类中定义,
常用flag如下:
FLAG_ACTIVITY_NEW_TASK--通知系统将目标activity作为一个新task的初始activity;
FLAG_ACTIVITY_NO_HISTORY--通知系统不要将目标activity放入历史栈中;例如: A-B-C-D-E, 其中C intent设置flag D,D-> E 这时候:A-B-C-E
FLAG_FROM_BACKGROUND--通知系统这个Intent来源于后台操作, 而非用户的直接选择...
FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET--重置该task时清除该activity, 例如: ActivityA intent(flag) -> B , 在B中按下HOME再回来,B被finish,只有A在stack
FLAG_ACTIVITY_CLEAR_TOP--已经启动了四个Activity:A,B,C和D; 在D Activity -> B Activity,同时希望C,D finish掉,即D->B 需要设置flag,
如果B Activity的启动模式是默认的(multiple) ,则B Activity会finished掉,再启动一个新的Activity B。如果不想重新再创建一个新的BActivity,
则在上面的代码里再加上:intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
这样B Activity就会再创建一个新的了,而是会重用之前的B Activity,同时调用B Activity的onNewIntent()方法。
FLAG_ACTIVITY_REORDER_TO_FRONT--如果已经启动了四个Activity:A,B,C和D,这 D-> B 设置flag,==>不变成A,B,C,D,B,而是A,C,D,B
四种启动模式launchMode:
1.standard ---- 无论如何都会intent出一个新TASK
2.singleTop ----如果当前intent Activity 已经是在stack顶部,即不会重新创建,否则会跟standard模式一样。
3.singleTask ---singleTask模式和后面的singleInstance模式都是只创建一个实例的
4.singleInstance --- 这种启动模式比较特殊,因为它会启用一个新的栈结构,将Acitvity放置于这个新的栈结构中,并保证不再有其他Activity实例进入.
13, android解析xml和json区别
JSON Vs XML
相同点:1、两者的数据可读性基本相同
2、两者拥有同样丰富的解析手段
异同点:1、json的数据体积更小
2、json与JS的交互更加方便
3、json的解析速度更快
4、xml对数据的描述性更好 5、轻/重量级方面的区别:JSON只提供了整体解析方案,而这种方法只在解析较少的数据时才能起到良好效果;而XML提供了对大规模数据的逐步解析方案,这种方案很适用于对大量数据的处理。对于应用程序而言,只要整体数据可以一次性读取和写入的,都只能算是轻量级应用。所以还要依赖其它特征来选择JSON或XML
深剖Google FlatBuffers工作原理:http://www.csdn.net/article/2015-08-31/2825579 , https://github.com/google/flatbuffers
1.由于是以二进制形式缓存,访问序列化数据时也无需数据解析过程,
2.Flatbuffers数据不需要分配比自身使用缓冲区还要多的内存。我们不必像在JSON中那样为解析数据的整个层次分配额外对象。
FlatBuffers 与Json 区别:
1.JSON——大家可能都知道它是几乎所有现代服务器都使用的轻量级数据交换格式。它体量轻,可读性强,通常比老式的、不友好的XML开发起来更加便捷友好。JSON是不依赖于开发语言的数据格式,但是在解析数据并将其转换到如Java对象时,会消耗我们的时间和存储资源。
2.FlatBuffers--由于是以二进制形式缓存,访问序列化数据时也无需数据解析过程。即使对于层次化数据也不需要解析。多亏不需要初始化解析器(初始化意味着要建立复杂的字段映射)和解析数据,这些都是需要花费时间的。
Flatbuffers数据不需要分配比自身使用缓冲区还要多的内存。我们不必像在JSON中那样为解析数据的整个层次分配额外对象。
3.介绍在Android应用程序中使用Flatbuffers的最简单方法:
---JSON数据在应用程序之外的某个地方被转换成FlatBuffer格式的文件(例如,将二进制数据以文件的形式提交,还可以从API直接返回FlatBuffer二进制文件)。
---在flatc (FlatBuffer编译器)的帮助下,手工生成数据模型(Java类)。
---JSON文件存在一定的局限性(不能使用null字段,日期格式也被解析为字符串)。
14, SAX,XPULL,DOM 区别:
1.SAX是一个解析速度快并且占用内存少的xml解析器,非常适合用于 Android等移动设备
2.
3.DOM需要将 XML文件的所有内容读取到内存中,所以内存的消耗比较大
15:Android高效加载大图、多图解决方案_LruCache,有效避免程序OOM
1.BitmapFactory这个类提供了多个解析方法(decodeByteArray, decodeFile, decodeResource等)用于创建Bitmap对象.BitmapFactory.Options参数,将这个参数的inJustDecodeBounds属性设置为true就可以让解析方法禁止为bitmap分配内存,返回值也不再是一个Bitmap对象,而是null。虽然Bitmap是null了,但是BitmapFactory.Options的outWidth、outHeight和outMimeType属性都会被赋值。这个技巧让我们可以在加载图片之前就获取到图片的长宽值和MIME类型,从而根据情况对图片进行压缩。假设图片是ARGB_8888类型,即每个像素点占用4个字节) RGC_565 占2字节。
2.内存缓存技术对那些大量占用应用程序宝贵内存的图片提供了快速访问的方法。其中最核心的类是LruCache (此类在android-support-v4的包中提供) 这个类非常适合用来缓存图片,它的主要算法原理是:把最近使用的对象用强引用存储在 LinkedHashMap 中,并且把最近最少使用的对象在缓存值达到预设定值之前从内存中移除。
在过去,我们经常会使用一种非常流行的内存缓存技术的实现,即软引用或弱引用 (SoftReference or WeakReference)。但是现在已经不再推荐使用这种方式了,因为从 Android 2.3 (API Level 9)开始,垃圾回收器会更倾向于回收持有软引用或弱引用的对象,这让软引用和弱引用变得不再可靠。另外,Android 3.0 (API Level 11)中,图片的数据会存储在本地的内存当中,因而无法用一种可预见的方式将其释放,这就有潜在的风险造成应用程序的内存溢出并崩溃。
代码实例:
private LruCache<String, Bitmap> mMemoryCache;
@Override
protected void onCreate(Bundle savedInstanceState) {
// 获取到可用内存的最大值,使用内存超出这个值会引起OutOfMemory异常。
// LruCache通过构造函数传入缓存值,以KB为单位。
int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);
// 使用最大可用内存值的1/8作为缓存的大小。
int cacheSize = maxMemory / 8;
mMemoryCache = new LruCache<String, Bitmap>(cacheSize) {
@Override
protected int sizeOf(String key, Bitmap bitmap) {
// 重写此方法来衡量每张图片的大小,默认返回图片数量。
return bitmap.getByteCount() / 1024;
}
};
}
public void addBitmapToMemoryCache(String key, Bitmap bitmap) {
if (getBitmapFromMemCache(key) == null) {
mMemoryCache.put(key, bitmap);
}
}
public Bitmap getBitmapFromMemCache(String key) {
return mMemoryCache.get(key);
}
16. TCP 三次握手四次挥手
第一次握手:
客户端发送一个TCP的SYN标志位置1的包指明客户打算连接的服务器的端口,以及初始序号X,保存在包头的序列号(Sequence Number)字段里。
第二次握手:
服务器发回确认包(ACK)应答。即SYN标志位和ACK标志位均为1同时,将确认序号(Acknowledgement Number)设置为客户的I S N加1以.即X+1。
第三次握手.
客户端再次发送确认包(ACK) SYN标志位为0,ACK标志位为1.并且把服务器发来ACK的序号字段+1,放在确定字段中发送给对方.并且在数据段放写ISN的+1
TCP的三次握手(方框中的内容) (SYN, (SYN+ACK), ACK)
四次挥手:
简单说来是 “先关读,后关写”,一共需要四个阶段。以客户机发起关闭连接为例:
1.服务器读通道关闭 ------- 1.服务器收到FIN(i)后,返回确认段ACK,序列号为i+1,关闭服务器读通道;
2.客户机写通道关闭 ------- 2.客户机收到ACK(i+1)后,关闭客户机写通道;
(此时,客户机仍能通过读通道读取服务器的数据,服务器仍能通过写通道写数据)
第二阶段 服务器发送完数据之后,向客户机发送一个FIN数据段,序列号为j;
3.客户机读通道关闭 ------- 3.客户机收到FIN(j)后,返回确认段ACK,序列号为j+1,关闭客户机读通道;
4.服务器写通道关闭 -------- 4.服务器收到ACK(j+1)后,关闭服务器写通道。
17. 了解android http请求 同步与异步的区别
给你举一个例子,点击按钮执行HTTP请求然后跳转下一页。
同步:发送http请求→获取返回结果→分析结果→跳转下一页
异步:发送http请求→跳转下一页(不需要等待请求结果,对结果的处理在另一个线程中)
同步是用主线程去访问;异步是用子线程去访问,主线程若是的同步的话会卡死ui界面,所以在Android4.1以后不允许使用同步请求了。
17.1. 网络优化
更多见 性能优化第四篇——移动网络优化
以下是网络优化中一些客户端和服务器端需要尽量遵守的准则:
a. 图片必须缓存,最好根据机型做图片做图片适配
b. 所有http请求必须添加httptimeout
c. 开启gzip压缩
d. api接口数据以json格式返回,而不是xml或html
e. 根据http头信息中的Cache-Control及expires域确定是否缓存请求结果。
f. 确定网络请求的connection是否keep-alive
g. 减少网络请求次数,服务器端适当做请求合并。
h. 减少重定向次数
i. api接口服务器端响应时间不超过100ms
google正在做将移动端网页速度降至1秒的项目,关注中https://developers.google.com/speed/docs/insights/mobile
18. 属性动画
19. Android网络框架Volley http://blog.csdn.net/jdsjlzx/article/details/40738181
---Volley是Google I/O 2013推出的网络通信库,在volley推出之前我们一般会选择比较成熟的第三方网络通信库
android-async-http
retrofit
okhttp
他们各有优劣,之前个人则比较喜欢用android-async-http, 如今Google推出了官方的针对Android平台上的网络通信库,能使网络通信更快,更简单,更健壮,Volley在提供了高性能网络通讯功能的同时,对网络图片加载也提供了良好的支持,完全可以满足简单REST客户端的需求, 我们没有理由不跟上时代的潮流
文件上传:
当图片正常压缩后,以及base64编码处理后,已经实现了图片压缩处理最优化;最后只需要找一个支持Https协议的框架上传即可。如AsyncHttp框架,volley不支持https协议上传,改写框架后,传输效率仍比不上AsyncHttp框架。
20. 怎么屏幕适配
1.最新google推出了百分比布局,以后也不会太担心适配的问题了。https://github.com/JulienGenoud/android-percent-support-lib-sample
屏幕分辨率是指在横纵向上的像素点数,单位是px,1px=1个像素点.
屏幕像素密度是指每英寸上的像素点数,单位是dpi.
dip和dp是一个意思,都是Density Independent Pixels的缩写,即密度无关像素,
dpi是屏幕像素密度,假如一英寸里面有160个像素,这个屏幕的像素密度就是160dpi,那么在这种情况下,dp和px如何换算呢?在Android中,规定以160dpi为基准,1dip=1px,如果密度是320dpi,则1dip=2px,以此类推。
2. 直接用需求PX 图完成适配,AndroidAutoLayout 布局 http://android-arsenal.com/details/1/2841
21. Android 编程下字库:
1.默认情况下 TextView 的 typeface 属性支持 "Sans","serif","monospace" 这三种字体,如果在没有指定字体的情况下,系统缺省会使用 "Sans" 作为文本显示的字体。
2.默认字库存放在system/fonts/xxx.ttf . 在获取ROOT 权限后可以修改默认的字库,。也可以通过APP指定使用的字库。
22.传对象的时候有两种情况,一种是实现Parcelable接口,一种是实现Serializable接口。
1)实现Serializable接口是JavaSE本身就支持的。
2)Parcelable是Android特有的功能,效率比实现Serializable接口高,像用于Intent数据传递也都支持,而且还可以用在进程间通信(IPC),除了基本类型外,只有实现了Parcelable接口的类才能被放入Parcel中。bitmap 默认是实现parcelable 接口
23. 集合介绍
Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素。一些Collection允许相同的元素而另一些不行。一些能排序而另一些不行。Java JDK不能提供直接继承自Collection的类,Java JDK提供的类都是继承自Collection的"子接口",如:List和Set。
注意:Map没有继承Collection接口,Map提供key到value的映射。一个Map中不能包含相同key,每个key只能映射一个value。Map接口提供3种集合的视图,Map的内容可以被当做一组key集合,一组value集合,或者一组key-value映射。
详细介绍:
List特点:元素有放入顺序,元素可重复
Map特点:元素按键值对存储,无放入顺序
Set特点:元素无放入顺序,元素不可重复(注意:元素虽然无放入顺序,但是元素在set中的位置是有该元素的HashCode决定的,其位置其实是固定的)
List接口有三个实现类:LinkedList,ArrayList,Vector
LinkedList:底层基于链表实现,链表内存是散乱的,每一个元素存储本身内存地址的同时还存储下一个元素的地址。链表增删快,查找慢
ArrayList和Vector的区别:ArrayList是非线程安全的,效率高;Vector是基于线程安全的,效率低
Set接口有两个实现类:HashSet(底层由HashMap实现),LinkedHashSet
SortedSet接口有一个实现类:TreeSet(底层由平衡二叉树实现)
Query接口有一个实现类:LinkList
Map接口有三个实现类:HashMap,HashTable,LinkeHashMap
HashMap非线程安全,高效,支持null;HashTable线程安全,低效,不支持null
SortedMap有一个实现类:TreeMap
其实最主要的是,list是用来处理序列的,而set是用来处理集的。Map是知道的,存储的是键值对
set 一般无序不重复.map kv 结构 list 有序
就个人而言.list 用的比较多. 其次map 最后set 至于什么情况下使用什么集合.看情况了. 也不好说.也没那么绝对.
看了下面的这个就更容易明白了
24.Java通过Executors提供四种线程池,分别为:
newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。
newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
25. AIDL注意:
1. 注册C/S 两边的AIDL 文件一致性,另外如果新增方法最后在末端追加,因为AIDL 方法排序是以index 指针来排,见gen/下面生成的aidl.java 里面有一个TRANSACTION_ubGCPlayerInit 进入可以看到。
5. 论坛:
国内: Android 中文网, eoeAndroid, CSDN
国外 http://stackoverflow.com/ ,google 论坛。
6. 第三方框架:
1. Fresco 是一个强大的Android图片加载框架 [facebook在用]
2. PhoneGap 跨平台免费开源移动应用开发框架。 该框架是允许利用各类主流WEB技术开发APP,包括HTML,CSS,JAVASCRIPT...
3. 测试工具Genymotion 一款Android 模拟器
4. Fluid 原型UI工具
5. Pencil 是一款开源图形用户界面GUI
6. Android Asset Studio 为Android生成各类图标,文字或者剪贴素材。
7. Icon4Android 是一套极具人气的在线资源集合,能够帮助我们为自已的ANDROID应用找到理想的图标素材。
7. Android 多分辨率适配资源生成工具:
https://github.com/hongyangAndroid/Android_Blog_Demos/tree/master/blogcodes/src/main/java/com/zhy/blogcodes/genvalues
http://blog.csdn.net/lmj623565791/article/details/45460089
内置了常用的分辨率,默认基准为480*320,当然对于特殊需求,通过命令行指定即可:
基准 1280 * 800 ,额外支持尺寸:1152 * 735;4500 * 3200;
生成命令: java -jar xx.jar width height width,height_width,height
E:\TechFile_Andy\多分辨率生成工具>java -jar autolayout.jar 1440 2560 1080,1920_7
68,1280
这篇关于业余收集的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!