android学习杂记.3

looper  handler   (线程中可以通信)
looper、handler、Messagequeue 3者实现了线程中的通信机制
先在线程里创建一个handler ,里面自动创建一个looper和消息队列  通过looper.perpare()让该消息队列指向当前线程的消息队列,从而实现了与线程的绑定
looper.loop()后不停地遍历消息队列,如果没消息会阻塞,有就调用handlerMessage方法




IBinder 接口
IBinder接口是对跨进程的对象的抽象。普通对象在当前进程可以访问,如果希望对象能被其它进程访问,那就必须实现IBinder接口。IBinder接口可以指向本地对象,也可以指向远程对象,调用者不需要关心指向的对象是本地的还是远程。


Aidl  Android interface definition Language  Android 接口定义语言
发布以及调用远程服务,实现跨进程通信
编译器可以通过aidl文件生成一段代码,通过预先定义的接口达到两个进程内部通信进程进程跨界对象访问的目的。
1.引入AIDL的相关类;
2.调用aidl产生的class。理论上,参数可以传递基本数据类型和String,还有就是Bundle的派生类


ContentProvider实现应用间共享数据
写一个类继承ContentProvider类
<provider android:exported="true"
android:name="  "
android:authorities="com.itheima.person"
/>
里面有UriMatcher,query,insert,delete,update,getType方法,
把自己的数据通过 uri 的形式共享出去
调用的是sqlite里的增删查改方法
使用ContentResolver con=getContentResolver()调用使用ContentProvider的增删查改方法
ContentProvider 屏蔽了数据存储的细节,内部实现对用户完全透明,
用户只需要关心操作数据的 uri 就可以了,ContentProvider 可以
实现不同 app 之间共享。


ipc:interprocess communication :内部进程通信
aidl: Android Interface definition language




singleTop 栈顶
singleTask singleInstance只创建一个实例




复写onSaveInstanceState()方法保存activity销毁之前的值,调用发生在onPause或者onStop()之前。
设置activity为窗口android:theme="@android:style/Theme.Dialog"
动态注册广播registerReceiver(receiver, filter)


生命周期长的对象可以使用application,context
避免非静态的内部类,尽量使用静态类
两个activity之间传数据,intent,BroadcastReceiver,ContentProvider,static静态数据,file文件存储,sharedpreferences,sqlite


service不能执行耗时的操作
activity通过bindservice与service进行绑定
在activity中通过bindservice和startservice 启动service
startservice 启动生命周期:oncreate(),onStartCommand(),关闭onDestory();
bindservice 执行oncreate(),onBind(),解绑onUnbind(),onDestory();


广播分为静态注册:
<receiver
android:name=".BroadcastReceiver1">
<intent-filter>
<action  android:name="android.intent.action.CALL">
</action>
</intent-filter>
</receiver>
动态注册:
receiver = new BroadcastReceiver();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(CALL_ACTION);
context.registerReceiver(receiver,intentFilter);
动态注册要注意解注册


Android数据存储方式:file存储,SharedPreference存储,ContentProvider存储,SQLiteDataBase存储,网络存储


ContentProvider内容提供者,用于对外提供数据
ContentResolver.notifyChange(uri)发出消息
ContentResolver内容解析者,用于获取内容提供者提供的数据
ContentObserver 内容监听器,可以监听数据的改变状态
ContentResolver.registerContentObserver()监听消息


在ScrollView中嵌套ListView 必须要重新计算ListView的高度


ListView 中优化图片
1、处理图片的方式:
(1、不要直接拿路径就去循环BitmapFactory.decodeFile;使用 Options 保存图片大小、不要加
载图片到内存去。 2、对图片一定要经过边界压缩尤其是比较大的图
片,如果你的图片是后台服务器处理好的那就不需要了 3、在 ListView 中取图片时也不要直接拿个路径去取图片,
而是以 WeakReference(使用WeakReference 代替强引用。比如
可以使用 WeakReference mContextRef)、SoftReference、
WeakHashMap 等的来存储图片信息。
4、在 getView 中做图片转换时,产生的中间变量一定及时释放)




2、异步加载图片基本思想: 1)、 先从内存缓存中获取图片显示(内存缓
冲) 2)、获取不到的话从 SD 卡里获取(SD 卡缓冲) 3)、都获取不到
的话从网络下载图片并保存到 SD 卡同时加入内存并显示(视情况看
是否要显示)


Serializable 和 Parcelable 的区别
在使用内存的时候,Parcelable类比Serializable性能高
Parcelable不能使用在要将数据存储在磁盘上的情况




线程产生内存泄露的主要原因在于线程生命周期的不可控


对线程导致的内存泄露问题的解决方案:
1.将线程的内部类,改为静态内部类
2.在线程内部采用弱引用保存Context引用
一般原则:对占用大量内存的变量,使用完后主动将其置为NULL,
可能的话主动调用一次GC:system.gc(),特别是一些static型的引用风险很大


图片过大导致OOM
界面切换导致OOM
查询数据库没有关闭游标
构造Adapter时,没有使用缓存的convertView
Bitmap对象不再使用时调用recycle()释放内存


android进程间通信
Aidl
Messenger
Bundle/Intent
contentprovider
管道pipe
信号量semophore
共享内存shared memory
套接字socket
Android线程间通信 
 共享内存(变量); 文件,数据库;
 Handler;
 Java 里的 wait(),notify(),notifyAll()




PendingIntent 延迟执行的intent


ANR  
一般有三种类型
1.KeyDispatchTimeout(5seconds)--主要类型
按键或触摸事件在特定事件内无响应
2.BroadcastTimeout(10seconds)
BroadcastReceiver在特定事件内无法处理完成
3.ServiceTimeout(20seconds)-小概率类型
Service在特定的时间内无法处理完成


超时的原因一般有两种:
1.当前的事件没有机会得到处理(UI 线程正在处理前一个事件没有及时完成或者looper被某种原因阻塞住)
2.当前的事件正在处理,但没有及时完成


dalvik是执行的时候编译+运行,安装比较快,开启应用比较慢,应用占用空间小
ART是安装的时候就编译好了,执行的时候直接就可以运行的,安装慢,开启应用快,占用空间大
dalvik 是已经折叠起来的自行车,每次骑都要先组装自行车才能骑
ART 是已经组装好的自行车,每次骑直接上车就能走人




android从下往上为linux内核层,运行库,应用程序框架层,应用程序层


如何合理使用内存?注意资源回收,像数据库,输入输出流,定位操作这样的对象,要在使用完及时关闭流。
少使用静态变量,因为系统将静态变量的优先级设定得很高,会最后回收。所以可能因为静态变量导致该回收的没有回收。而回收了不该回收的内存。
注意大图片的缩放,如果载入的图片很大,要先经过自己程序的处理,降低分辨率等。最好设置多种分辨率格式的图片,以减少内存消耗。
动态注册监听,把一些只有显示的时候才使用到的监听放进程序内部,而不是放在manifesat中去。
减少使用动画,或者适当减少动画的帧数。
注意自己的程序逻辑,在该关闭自己程序的控件的时候,主动关闭,不要交给系统去决定。


屏幕设配 dp   match weight 百分比


ldpi 的手机 1dp=0.75px 
mdpi 的手机 1dp=1.0px 
hdpi 的手机 1dp=1.5px 
xhdpi 的手机 1dp=2.0px 
xxhdpi 的手机 1dp=3.0px


DisplayMetrics metrics=new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);给当前metrics设置当前的屏幕信息
width=metrics.widthPixels;
height=metrics.heightPixels;把屏幕的宽高赋给width和height.
RelativeLayout.LayoutParams layoutParams=new RelativeLayout.LayoutParams((int)(width*0.5+0.5),(int)(height*0.5+0.5));
textview.setLayoutParams(layoutParams);给textview设置宽高为当前屏幕的50%;


android:screenOrientation="portrait"(landscape是横向,protrait是纵向)




不能在子线程中new Handler




**动画分为 Frame(帧动画) Tween(补间动画)       


    --(属性动画)http://blog.csdn.net/linglongxin24/article/details/53084234


ContentObserver 目的是观察特定Uri引起的数据库的变化,继而做一些相应的处理。


json数据 易读性 高效率


**自定义view


框架 1.EventBus(事件处理)
2.xUtils(网络,图片,ORM)
xUtils分为四大模块:1.DbUtils 2.ViewUtils 3.HttpUtils 4.BitmapUtil


三级缓存  1.从缓存中取。2.从文件中加载(数据库,SD卡)3.从网络加载


清除缓存:1.清除内存的缓存  2.数据库,SD。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值