Android开发中的技巧和踩坑

来源:互联网 发布:php接口开发实例代码 编辑:程序博客网 时间:2024/05/21 06:10

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

一、技巧篇

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

<RelativeLayout        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_centerInParent="true">        <TextView            android:id="@+id/tv"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_alignParentBottom="true"            android:text="一行一行一行一行两行两行"            android:textSize="50sp" /></RelativeLayout>

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是重开进程执行脚本,并且不需要脚本具有可执行权限;./则需要脚本具有可执行权限,否则报权限拒绝错误,./不是重开进程执行。

二、踩坑篇

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);     }});
2 0
原创粉丝点击