这篇博客持续更新自己总结的一些在项目开发中碰到的坑或者技巧,上篇是技巧篇,下篇是踩坑篇。借此以起到警示自己和帮助大家的作用!
1、懒汉式单例的双重校验锁写法,用到Java中的关键字Volatile
public class VolatileSingleton {
public static volatile VolatileSingleton mSingleton;
private VolatileSingleton() {
}
public static VolatileSingleton getInstance() {
if (null == mSingleton) {
synchronized (VolatileSingleton.class) {
if (null == mSingleton) {
mSingleton = new VolatileSingleton();
}
}
}
return mSingleton;
}
}
2、懒汉式单例的静态内部类写法
public class InnerClsSingleton {
private InnerClsSingleton() {
}
private static class SingletonLoader {
private static final InnerClsSingleton SINGLETON = new InnerClsSingleton();
}
public static InnerClsSingleton getInstance() {
return SingletonLoader.SINGLETON;
}
}
3、一行居中,多行局左的TextView,在TextView外层嵌套宽高为wrap_content,居中的VeiwGroup
4、让低版本系统的手机展示的AlertDialog也有好的风格,可以用android.support.v7.app.AlertDialog包下的AlertDialog
5、activity中,如果onActivityResult方法有执行,则其会在onResume方法之前执行。
6、try catch finally语句中,try中执行了return,finally中的代码依然会执行。
7、使用Handler定时滚动ViewPager时,当界面不可见时Handler还是会run,应该在不可见时停掉Handler
8、看图
实现类似如图中红框内图标超出布局高度的效果时,简单来写可以在布局文件的根布局使用android:clipChildren="false"属性,然后红框内布局高度超过其父布局即可,是不是比另写1个更高的布局简单些!
9、
for (int i = 0; i < mTabViews.length; i++) {
mTabViews[i].setOnClickListener(this);
}
像这种把数组或集合的size写入循环中是不合理的,每次循环都会计算size并创建int对象,所以应该这样写合理些
int size = mTabViews.length;
for (int i = 0; i < size ; i++) {
mTabViews[i].setOnClickListener(this);
}
10、针对Map,以下几种情况不要使用Map
如果key是int类型,则使用SparseArray;
如果key是long类型,则使用LongSparseArray;
如果value是int,则使用SparseIntArray;
如果value是boolean,则使用SparseBooleanArray;
如果value是long,则使用SparseLongArray;
11、执行shell脚本./方式和bash方式是有区别的,bash是重开进程执行脚本,并且不需要脚本具有可执行权限;./则需要脚本具有可执行权限,否则报权限拒绝错误,./不是重开进程执行。
12、在主线程刷新view调用invalidate好于postInvalidate,后者需要通过handler然后调用invalidate;在子线程就必须用postInvalidate了。
13、使用内部类时尽量使用静态内部类,可避免潜在的因内部类导致的内存泄漏。
14、一个复杂的业务逻辑不要用一个方法或类实现,要进行逻辑分层,不同的子逻辑做自己的事,使代码层次分明,易于维护。
15、单例模式不能用于跨进程通信。
1、Relativelayout布局,View1相对于View2存在时,若设置View1的visibility为Gone,则View2的相对于View1的位置失效,布局错误,此类建议设置为INVISIBLE。
2、垂直的RecyclerView嵌套水平的RecyclerView时,水平的RecyclerView的高度要手动测量指定,因为系统测量的高度是错误的。
3、写循环时切忌要避免死循环,可以用1个最大循环值以控制循环次数。
4、在RecyclerView列表的条目中不能判断图片的url是否为空然后再用Fresco的SimpleDrawView控件加载图片,因为来回滑动可能会复用错误的图片到url错误或为null的item上,直接加载即可。
5、上线项目时一定一定一定要测试核心功能,比如数据统计等。
6、linux命令千万别执行 rm -rf 命令,这几乎是毁灭性的。
7、重要的数据比如shell脚本、配置文件等记得备份,未来很有可能你会用到。
8、使用SurfaceView播放视频时,记得SurfaceHolder.addCallback()一定要在SurfaceView实例化之后就调用,否则可能导致addCallback()方法执行之后迟迟不走surfaceCreated()回调方法。
9、在Manifest文件中对Activity标签配置了android:configChanges="orientation|keyboardHidden|screenSize"
横竖屏切换时,就不会走onCreate(),而是回调onConfigurationChanged()方法,因此也不会自动加载layout-land目录下的横屏布局。
10、自定义View偶现setVisibility(View.VISIBLE)后不显示,通常手动在主线程调用invalidate()或在子线程调用postInvalidate()可解决。也可以试试在布局文件中不要设置为gone,而是用invisible代替。
11、View.setLayoutParams(layoutParams)不生效可以用这种方式:
view.post(new Runnable() {
@Override
public void run() {
view.setLayoutParams(lp);
}
});
12、SharedPreference在不同的进程进行存取操作会产生取不到存入的值的后果,所以使用SharedPreference的时候要保证在同一个进程中。
13、如果需要用WebView预加载h5页面,则用getApplicationContext()进行初始化WebView,以规避内存泄漏的风险,但是以此方法会造成onJsAlert回调的弹框无法显示。所以h5的一些弹框逻辑建议不用alert弹框方式实现!
14、js调用native的方法不在主线程,所以一些UI操作等要切换到主线程处理。
15、Could not GET 'https://jcenter.bintray.com/org/codehaus/groovy/groovy-all/2.4.12/groovy-all-2.4.12.jar
报错。此错误是groovy-all-2.4.12.jar下载失败,这时可以把jcenter库改为从阿里云镜像库下载。具体操作如下:在工程的build.gradle文件中将
google()
jcenter()
改为
maven { url 'https://maven.aliyun.com/repository/google' }
maven { url 'https://maven.aliyun.com/repository/jcenter' }
maven { url 'http://maven.aliyun.com/nexus/content/groups/public' }