Android常见问题及开发经验总结(四)

2023-02-10 18:47:01 浏览数 (1)

这个整理的知识点可能比较杂而且 没有什么顺序,希望大家见谅..

android中一般上拉加载下拉刷新都用什么实现?

常用的一般是 pulltorefresh   goole官方推出的是SwipeRefreshLayout  但是这个不能下拉加载  我觉得这个就是硬伤。 推荐还是pulltorefresh.

android做适配时,会将不同大小的图片放在不同的目录,为什么不直接将一张最大的图片放在drawable-xxhdpi目录下?因为程序会自动对图片进行缩放呀,没有必要做小图片了,是不是很省事,还是其他原因?

答:1)有些情况压缩会失真

       2)有些设备 分辨率比较特殊

但是我个人建议 用一套大图放到xxhdpi下面,原因是

1.除了一些不规则的圆角之类的非.9图片因为从大图压小会造成圆角变小,其他的图片基本上都可以从高dpi压缩到低dpi使用。所以只维持一套drawable-xxhdpi资源就可以了,特殊的图片才分多个资源放不同的dpi目录。这样会省掉大量的UI适配时间。

2.放一套drawable-hdpi的资源适配hdpi的机器效果也很一般,效果没有多大提升。

3.放一套这样适配也可以减少apk大小。

除非你是做系统级别的超高要求的App,才用多套资源对不同dpi的设备。

android中单例模式的使用场景一般有哪些?需要注意哪些问题?

单例模式(Singleton):保证一个类仅有一个实例,并提供一个访问它的全局访问点

1)应用中某个实例对象需要频繁的被访问。

2)应用中每次启动只会存在一个实例。如账号系统,数据库系统。

使用单例需要注意以下几点问题:

1)必须防止外部可以调用构造函数进行实例化,因此构造函数必须私有化。

2)必须定义一个静态函数获得该单例

3)单例使用volatile修饰

4)使用synchronized 进行同步处理,并且双重判断是否为null,我们看到synchronized (Singleton.class)里面又进行了是否为null的判断,这是因为一个线程进入了该代码,如果另一个线程在等待,这时候前一个线程创建了一个实例出来完毕后,另一个线程获得锁进入该同步代码,实例已经存在,没必要再次创建,因此这个判断是否是null还是必须的。

static变量可以在程序中使用吗?有什么问题?

很多同学喜欢用static变量,可以在不同的包和类中调用,省的传来传去的。

这个我是不建议使用,因为 一是有被回收的危险,导致值为空,二是会有值需要清理的问题。

什么意思呢?这个说来话长 ,简单来说 是因为静态变量和类一样都是在进程加载的时候被加载,在进程结束的时候被结束。而android对于进程和内存的管理和PC不一样,在资源足够的情况下,android会重启被杀掉的进程。也就是说 静态变量的值不可靠,也可以理解为内存的值不可靠。

有同学说 我退出应用了,进程不就被杀死了吗?这个不是的 这两个不是等价关系,也就是说 你的static变量 在一些时候你没有做手动的一些清理工作,有可能值会还存在 ,导致程序出现错误。

所以本人不建议程序中大量使用static变量。

android开发中数据库的使用场景有哪些呢?

一般用到数据库 

1.比较复杂的表结构需要本地存储 

2.基本不需要更新的字典数据 比如 省市县 ,这个更新频率很低。

3.涉及到一些数据安全问题的数据。

单一性质的json数据还是用prefs方便一点。

AIDL是什么 应用场景有哪些?

AIDL是一个缩写,全称是Android Interface Definition Language,也就是Android接口定义语言,设计这门语言的目的是为了实现进程间通信,尤其是在涉及多进程并发情况下的进程间通信。

1.提供接口给外部应用调用,可以是sdk,也可以是同个公司里多个app的通信~ 2.当同一个应用时,服务设置单独进程,即后台与前台activity分离,不希望前台被回收影响到后台运行的场景下,比如音乐播放器,或一些偷偷摸摸干的事…… AIDL当然很多情况下,也可以用广播来实现,但是耗时和灵活性上还是建议用AIDL来实现。

android音频解码有什么三方库吗?需要支持aac、acc、ape等无损音频.

ffmpeg

如何显示menu上面的三个点?

有些机型如果显示不出来那三个点 ,可以参考此博客里面的方法 http://blog.csdn.net/shaoyezhangliwei/article/details/47833941

Android里面为什么要设计出Bundle而不是直接用Map结构

  • Bundle内部是由ArrayMap实现的,ArrayMap的内部实现是两个数组,一个int数组是存储对象数据对应下标,一个对象数组保存key和value,内部使用二分法对key进行排序,所以在添加、删除、查找数据的时候,都会使用二分法查找,只适合于小数据量操作,如果在数据量比较大的情况下,那么它的性能将退化。而HashMap内部则是数组 链表结构,所以在数据量较少的时候,HashMap的Entry Array比ArrayMap占用更多的内存。因为使用Bundle的场景大多数为小数据量,我没见过在两个Activity之间传递10个以上数据的场景,所以相比之下,在这种情况下使用ArrayMap保存数据,在操作速度和内存占用上都具有优势,因此使用Bundle来传递数据,可以保证更快的速度和更少的内存占用。
  • 另外一个原因,则是在Android中如果使用Intent来携带数据的话,需要数据是基本类型或者是可序列化类型,HashMap使用Serializable进行序列化,而Bundle则是使用Parcelable进行序列化。而在Android平台中,更推荐使用Parcelable实现序列化,虽然写法复杂,但是开销更小,所以为了更加快速的进行数据的序列化和反序列化,系统封装了Bundle类,方便我们进行数据的传输。

Android Studio Drawable和Mipmap文件夹的区别

把图片放到mipmiaps可以提高系统渲染图片的速度,提高图片质量,减少GPU压力。

Android 开发过程中 常用的设计模式都有哪些?

1)单例模式  

2)观察者模式

这两个是我用的最多的。

其它的还有

Builder模式  外观模式 模板方法 策略模式 代理模式 迭代器模式 责任链模式 命令模式 桥接模式 原型模式。

这些都是带链接的 大家需要哪个自己点击学习就行。

android中 一般图片都是什么格式的?

1.app应用本身的一般都是png 2.如果是用户上传的图片,的一般会处理成jpg格式,上传到服务器后会做webp的转化,别的用户看到的图片就是webp格式的,图片质量不仔细研究看不出来和jpg原图的差别,但是流量却节省了非常多;

声明ViewHolder内部类时,为什么建议使用static关键字

这个是静态内部类和非静态内部类的主要区别之一。非静态内部类会隐式持有外部类的引用,就像大家经常将自定义的adapter在Activity类里,然后在adapter类里面是可以随意调用外部activity的方法的。当你将内部类定义为static时,你就调用不了外部类的实例方法了,因为这时候静态内部类是不持有外部类的引用的。声明ViewHolder静态内部类,可以将ViewHolder和外部类解引用。大家会说一般ViewHolder都很简单,不定义为static也没事吧。确实如此,但是如果你将它定义为static的,说明你懂这些含义。万一有一天你在这个ViewHolder加入一些复杂逻辑,做了一些耗时工作,那么如果ViewHolder是非静态内部类的话,就很容易出现内存泄露。如果是静态的话,你就不能直接引用外部类,迫使你关注如何避免相互引用。 所以将 ViewHolder内部类 定义为静态的,是一种好习惯。

Android进程间通信有哪几种方式?

Activity、Content Provider、Broadcast和Service

其中Activity可以跨进程调用其他应用程序的Activity;Content Provider可以跨进程访问其他应用程序中的数据(以Cursor对象形式返回),当然,也可以对其他应用程序的数据进行增、删、改操 作;Broadcast可以向android系统中所有应用程序发送广播,而需要跨进程通讯的应用程序可以监听这些广播;Service和Content Provider类似,也可以访问其他应用程序中的数据,但不同的是,Content Provider返回的是Cursor对象,而Service返回的是Java对象,这种可以跨进程通讯的服务叫AIDL服务。

android 横竖屏切换的时候生命周期是怎样的?

这个问题 网上太多,但是好多都是同一篇文章 

1、不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次 2、设置Activity的android:configChanges="orientation"时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次 3、设置Activity的android:configChanges="orientation|keyboardHidden"时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法

基本上网上都是这个说法,但其实这个回答是有些问题的。大家自己真正测试的时候就发现了。

所以我还是不建议大家互相传播抄袭,大家测试后再写出来会更好一点。

简单来讲是这么说:

  1. 如果自己没有配置android:ConfigChanges,这时默认让系统处理,就会重建Activity,此时Activity的生命周期会走一遍。
  2. 如果自己handle了,系统就不处理了,Activity不会重建,只会回调onConfigurationChanged方法
  3. 当API >12时,需要加入screenSize属性,否则屏幕切换时即使你设置了orientation系统也会重建Activity 。

我是在项目里面这样配置 android:configChanges="orientation|screenSize" 切屏时候就不重新走生命周期了...大家也可以自己写个demo测试确认下..

ScrollView滚回顶部的三种方式

一、ScrollView.scrollTo(0,0)  直接置顶,瞬间回到顶部,没有滚动过程,其中Y值可以设置为大于0的值,使Scrollview停在指定位置;

二、ScrollView.fullScroll(View.FOCUS_UP)  类似于手动拖回顶部,有滚动过程;

三、ScrollView.smoothScrollTo(0, 0) 类似于手动拖回顶部,有滚动过程,其中Y值可以设置为大于0的值,使Scrollview停在指定位置。

做android 碰到的问题太多了,一般都是碰到了 有的随手记到txt里面,有的就忘了。写这个的目的就是希望大家也养成一个好习惯,或者在开发过程中碰到过那些问题,有哪些小技巧都可以分享出来,大家也可以评论到本博客下面,这个博客和上一篇总结性的文章 (android开发日积月累)  一样都会长期置顶,随时更新。希望我们这些前人能给后人做点贡献。

0 人点赞