子线程借用主线程里的handle对象发送一条消息到主线程,这条消息会被主线程放到消息队列MessageQueue里,主线程里有一个消息轮询器,会不断地查看消息队列里有没有新的消息,如果有请求消息,调用handler,执行handleMessage方法处理这条消息
就可以更新ui
图片缓存原理
首先根据图片的网络地址在网络上下载图片,将图片先缓存到内存缓存中,缓存到强引用中,也就是lruCache中,如果强引空间不足,就会将较早存储的图片驱逐到软引用中存储,然后将图片缓存到文件(内部存储外部存储)中;
读取图片的时候,先读取内存缓存,判断强引用中是否存在图片,如果强引用中存在,则直接读取。如果强引用中不存在,则判断软引用中是否存在,如果软引用中存在,则将软引用中的图片添加到强引用中并且删除软引用中的数据。 如果软引用中不存在,则读取文件存储,如果文件存储不存在,则网络加载
下载:网络--->内存--->文件
读取:内存--->强引用--->软引用--->文件--->网络
Activity与Fragment生命周期的协调
拥有Fragment的Activity的生命周期直接影响了其中的Fragment的生命周期,总的一句话说就是在创建的过程中是Activity带领着Fragment,在销毁过程中,是Fragment带领Activity
在创建的过程中,生命周期执行的顺序:
Activity---->onCreate();
Fragment---->onAttach()--->onCreate()---->onCreateView()---->onActivityCreated();
Activity----->onStart(); Fragment----->onStart();
Activity----->onResume(); Fragment----->onResume();
当销毁的时候,是Fragment先感知到,于是销毁的时候是Fragment带领着Activity
Fragment--onPause(); Activity--onPause();
Fragment--onStop(); Activity--onStop();
Fragment--onDestroyView()--->Fragment--onDestroy()--->Fragment--onDetach(); Activity--onDestroy();
屏幕适配
1.充分利用”wrap_content” 、”match_parent”以及“weight”
通常我们会在布局视图中使用”wrap_content”和”match_parent”来确定它的宽和高。如果你使用了”wrap_content”,相应视图的宽和高就会被设定成刚好能够包含视图中内容的最小值。而如果你使用了”match_parent”,就会让视图的宽和高延伸至充满整个父布局。
2.多使用相对布局RelativeLayout,少使用绝对布局
RelativeLayout允许布局的子控件之间使用相对定位的方式控制控件的位置,比如你可以让一个子视图居屏幕左侧对齐,让另一个子视图居屏幕右侧对齐。
3.使用尺寸Size限定符
我们的应用程序实现可自适应的布局外,还应该提供一些方案根据屏幕的配置来加载不同的布局,可以通过配置限定符(configuration qualifiers)来实现。配置限定符允许程序在运行时根据当前设备的配置自动加载合适的资源(比如为不同尺寸屏幕设计不同的布局)。
4.使用.9图
“点九”是andriod平台的应用软件开发里的一种特殊的图片形式,文件扩展名为:.9.png
我们都知道android平台有多种不同的分辨率,很多控件的切图文件在被放大拉伸后,边角会模糊失真。OK,在android平台下使用点九PNG技术,可以将图片横向和纵向同时进行拉伸,以实现在多分辨率下的完美显示效果。
5.实现百分比布局
Service
两种启动方式
Context.startService() 和 Context.bindService()。
1.startService()方式启动时的生命周期回调方法
(1)启动服务startService : –>onCreate()–> onStart()
(2)停止服务stopService : –>onDestroy()
如果调用者直接退出而没有停止Service,则Service 会一直在后台运行。这里的退走只是关闭了UI界面
startService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方 法,接着调用onStart()方法。如果调用startService()方法前服务已经被创建,多次调用 startService()方法并不会导致多次创建服务,但会导致多次调用onStart()方法。采用 startService()方法启动的服务,只能调用stopService()方法结束服务,服务结束时 会调用生命周期的onDestroy()方法。
2.bindService()方式启动时的生命周期回调方法
(1)绑定bindService : –> onCreate() –> onBind()
(2)解绑unbindService: –>onUnbind()
(3)正常停止程序服务的方法是先解绑unbindService,再停止服务stopService。
(4)如果绑定后调用stopService 方法,这时是不能停止服务的,如果这时再调用解绑unbindService,程序后先解绑,后停止服务。
用bindService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate() 方法,接着调用onBind()方法。这个时候调用者和服务绑定在一起,调用者退出了,系统就会
先调用服务的onUnbind()方法,接着调用onDestroy()方法。如果调用 bindService()方法前服务已经被绑定,多次调用bindService()方法并不会导致多次创建服务及绑定(也就是说 onCreate()和onBind()方法并不会被多次调用)。如果调用者希望与正在绑定的服务解除绑 定,可以调用unbindService()方法,调用该方法也会导致系统调用服务的onUnbind()->onDestroy()方法。
ScrollView中嵌套ListView的冲突解决
(1)手动的设置ListView的高度
(2)使用单个ListView取代ScrollView中所有内容
就是说,把整个需要放在ScrollView中的内容,统统放在ListView中
(3)使用LinearLayout取代ListView
(4)自定义可适应ScrollView的ListView(推荐)
自定义一个类继承自ListView,通过重写其onMeasure方法,达到对ScrollView适配的效果
方法1的优点是不用对使用的控件做任何修改,只需要使用一个现成的方法就好了,而最大的限制是ListView的item只能由LinearLayout这一个布局组成,对于一些复杂的布局就不适用了。
方法2的优点是布局文件设计简单、Activity中的代码也很少,
而缺点却是自定义Adapter变得十分复杂,而且执行效率会变低,
因为findViewById是十分费时的操作,而使用ViewHolder结构可以解决费时的问题
方法3的优点是完全解决了ScrollView嵌套ListView的问题,同时代码较少,但还是有两个:一是使用的不是系统控件,不能在xml布局的Graphical Layout视图中直接看到效果;二是不能向ListView那样可以使用ViewHolder结构,在加载大量子项时会费很多时间在findViewById中。
第四点代码更少,同时保留了ListView原有的所有方法,包括notifyDataSetChanged方法,
相比其他方法是最趋近于完美的方法,只是需要在Activity中设定ScrollView滚动至顶端。