处理屏幕旋转导致的重建,单例对象,StringBuilder进行拼接,ProGurad 混淆,VectorDrawable 及 AnimatedVectorDr

简介: 处理屏幕旋转导致的重建,单例对象,StringBuilder进行拼接,ProGurad 混淆,VectorDrawable 及 AnimatedVectorDr

处理屏幕旋转导致的重建



当屏幕发生旋转时,如果我们没有在AndroidManifest.xml中,对其configChanges属性进行声明,那么就会导致Activity进行重建,此时,就需要重新加载Activity所需要展示的数据。


在EditText控件中输入后,当屏幕旋转后,里面的内容就会不见,activity进行了重建,但是checkBox不会重建。


此时,我们就可以对其进行如下的声明:


android:configChanges="keyboardHidden|orientation|screenSize"

接着在ActivityonConfigurationChanged进行监听,对布局进行相应的改变,而不需要重新加载数据。


单例对象在需要的时候初始化



在使用单例时,我们应当仅在使用到该单例时才去初始化它,这里我们可以通过“静态初始化会在类被加载时触发”这一原理,来实现懒加载。


public class OptSingleton {
    private OptSingleton() {}
    public static OptSingleton getInstance() {
        return Holder.INSTANCE;
    }
    private static class Holder {
        public static final OptSingleton INSTANCE = new OptSingleton();
    }
}

采用StringBuilder的方式进行拼接:


public static void goodString() {
        StringBuilder result = new StringBuilder("result");
        String append = "append";
        for (int i = 0; i < (1 << 20); i++) {
            result.append(append);
        }
    }

减少不必要的异常



在某些时候,如果我们能预见到某些有可能会发生异常的场景,那么提前进行判断,将可以避免由于异常所带来的代价,以启动第三方应用为例,我们可以先判断该intent所对应的应用是否存在,再去启动它,而不是等到异常发生时再去捕获:


public static void startApp(Context context) {
        Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("www.qq.com"));
        intent.setComponent(new ComponentName("com.android.browser", "com.android.browser.BrowserActivity"));
        if (intent.resolveActivity(context.getPackageManager()) == null) {
            return;
        }
        try {
            context.startActivity(intent);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

使用 ProGurad 优化代码



通过ProGuard对代码进行优化、压缩、混淆,可以移除不需要的代码、重命名类、域与方法等,做法就是在buildTypes的指定类型下增加下面的代码:


buildTypes {
        release {
            //对于release版本采用进行混淆。
            minifyEnabled true
            shrinkResources true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-project.txt'
        }
        debug {
            //对于debug版本不混淆。
            minifyEnabled false
            shrinkResources true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-project.txt'
        }

这里的混淆规文件有两份,如果有多份,那么可以使用逗号分隔,第一个是Android自带的混淆文件,而第二个则是应用自定义的混淆规则文件,关于混淆文件的语法,


VectorDrawable 及 AnimatedVectorDrawable 使用详解:

www.jianshu.com/p/723dc385e…


对于只执行一次的后台任务,使用 IntentService 替代 Service



当我们需要将某些任务的生命周期和Activity分离开来,那么一般会使用Service,但是Service就需要我们进行手动管理,如果忘记,那么将会导致额外的内存占用,并且拥有Service进程的oom_adj值一般会高于没有Service的进程,系统会更倾向于将它保留。


对于一些短时的后台任务,我们可以考虑采用IntentService,它的onHandleIntent回调是在异步线程中执行的,并且任务执行完毕后,该Service会自动销毁,不需要手动管理。


ViewStub 动态加载布局



进行布局复用:


SpannableStringBuilder 替换多个 TextView

LinearLayout 自带的分割线:


android:showDividers="beginning|end|middle"

Space 控件进行合理的占位:



<android.support.v4.widget.Space
        android:layout_width="0dp"
        android:layout_height="50dp"
        android:layout_weight="1"/>

TextView 的 drawableLeft/drawableTop

AsyncLayoutInflater 异步加载;



public void onClick(View v) {
                AsyncLayoutInflater asyncLayoutInflater = new AsyncLayoutInflater(OptActivity.this);
                asyncLayoutInflater.inflate(R.layout.layout_async, root, new AsyncLayoutInflater.OnInflateFinishedListener() {
                    @Override
                    public void onInflateFinished(View view, int resId, ViewGroup parent) {
                        parent.addView(view);
                    }
                });



目录
相关文章
|
10月前
2020-10-10 数组和对象的区分方法
2020-10-10 数组和对象的区分方法
|
10月前
|
Java
Java方法继承、方法重载、方法覆盖总结
总之,继承实现类的层次结构,方法重载提供方法的多样性,方法覆盖实现多态性。这些概念是面向对象编程的核心,用于实现代码的结构、灵活性和可维护性。 买CN2云服务器,免备案服务器,高防服务器,就选蓝易云。百度搜索:蓝易云
51 0
|
10月前
|
JSON JavaScript 前端开发
对象的魔法世界:一文说清对象转换技巧和常用方法!
对象的魔法世界:一文说清对象转换技巧和常用方法!
|
10月前
|
Java
java中FileOutputStream流中有参构造方法有无append形参的区别--超详细讲解版
java中FileOutputStream流中有参构造方法有无append形参的区别--超详细讲解版
83 0
方法的重载和方法覆盖的区别
方法的重载和方法覆盖的区别
105 0
|
Java
JAVA的静态函数不能重载,可以覆盖(隐藏)
JAVA的静态函数不能重载,可以覆盖(隐藏)
88 0
|
Java
JAVA数组批量设值(初始化)的办法
JAVA数组批量设值(初始化)的办法
163 0
|
机器学习/深度学习 Java
Java方法重写的注意事项
需要特别说明“无修饰符”这个情况,子类能否访问父类中无修饰符的变量/方法,取决于子类的位置。如果子类和父类在同一个包中,那么子类可以访问父类中的无修饰符的变量/方法,否则不行。
97 0
|
Java 数据库
java反射机制查找类的属性并赋值
先说一下需求:最近做一个项目其中需要将前台传来的数组存到数据库,但是这个表里有15个字段,集合是不固定的,然后要把这个集合的数值赋给这个类的相应属性,然后存到数据库中。集合长度应小于等于这个类属性的个数。
373 0
|
Java 开发者
反射与类操作(反射调用构造)|学习笔记
快速学习 反射与类操作(反射调用构造)
142 0

热门文章

最新文章