Android开发中的技巧和踩坑

这篇博客持续更新自己总结的一些在项目开发中碰到的坑或者技巧,上篇是技巧篇,下篇是踩坑篇。借此以起到警示自己和帮助大家的作用!

一、技巧篇

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开发中的技巧和踩坑_第1张图片
实现类似如图中红框内图标超出布局高度的效果时,简单来写可以在布局文件的根布局使用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' }

你可能感兴趣的:(个人总结或心得,android,android开发,技巧,踩坑)