Results 39 comments of Petterp

这个库已经两年没维护了,我fork了一份新的,已适配agp7.x, 详见:https://github.com/Petterpx/walle

> > 这个库已经两年没维护了,我fork了一份新的,已适配agp7.x, 详见:https://github.com/Petterpx/walle > > 能否适配一下谷歌商店的aab格式? @Petterpx 短时间内应该不能,适配7.x比较简单。aab的话,还没有看过walle具体的源码,可以关注一下等等我后续适配。 其他方式上,对于googleplay,我们目前是单独对应了一个分支(有些组件googleplay不允许存在),所以你可以将渠道写死在本地逻辑里即可。 @scsfwgy

> 使用实现 'com.github.wendux:DSBridge-Android:3.0.0' Thank you. It worked for me

嗯,上面大佬们都说的差不多了。 先带上一张图 ![image](https://user-images.githubusercontent.com/41142188/57187057-fb27cb00-6f1b-11e9-92bc-2bc57755c34d.png) Java中的类加载过程为,加载-连接-初始化 **那类加载是什么意思呢?** 类加载指的是class文件读入内存,并为其创建一个Class对象,也就是程序使用任何一个类的时候,都会为其创建一个java.lang.Class对象。 ### 连接是什么意思呢? 连接阶段主要负责将类的二进制数据合并到jre中。 --**但是为什么要将数据合并到jre呢?** jre指的是java的运行时环境,也就是java虚拟机,因为各大平台不一样,也就是运行环境,所以java虚拟机相当于屏蔽了这些条件,这样java程序就可以实现编译一次,处处运行。也就是我们刚开始学java时的第一句话。 **初始化呢?** 简单来说,虚拟机负责对类进行初始化,其实也就是对变量进行初始化,初始化的时候,遵循以下3个条件: 1. 假如这个类没有被加载和连接,则程序先加载并连接该类。 2. 假如该类的直接父类还没有被初始化,则先初始化其直接父类。 3. 假如该类中有初始化语句,则系统一次执行这些初始化语句。 不过需要注意一点,当调用被final修饰的类变量时(基本类型),并不会引起类的初始化。 类加载机制的话,主要有以下3种: 全盘负责: 双亲委托: 缓存机制: **双亲委托**的话,用一个简单栗子来解释。 比如说你自己定义了一个java.lang.String类,但是你永远调用不了它,为什么呢? 因为String属于核心类,在类加载的过程中,由引导类加载器去加载,所以永远用不了自定义的这个类。 双亲委托机制也就是,当一个类加载器收到类加载请求后,他不会先去加载,而是让它的父加载器先去尝试,层层向上,只有父类无法加载,这时才会尝试让子类去加载,这也就是自己写的为啥无法加载。 **那缓存机制是什么呢?** 缓存机制保证我们加载过的类都会被缓存,这样当程序使用某个类时,首先从缓存区中去找,当找到了直接返回Class对象,避免了重复加载。这也就是为什么修改了代码,需要重新编译运行才会生效的原因了。...

。补充一些 最后 被最终修饰的变量,在编译时时已经确定了其值,那么它就相当于一个宏变量,程序会将使用到该变量值的地方都替换为该值;被最终修饰,编译时可以确定值的变量,不会随类而加载。 静 静是一个特殊的关键字,它可用于修饰方法,成员变量等成员.static修饰的成员表明他属于这个类本身,而不属于该类的单个实例。而我们非静态修饰的变量它属于的是实例的变量,所以为static成员不能直接访问静态成员。” 同步 我们一般称之为加锁,用于简单解决并发时数据操作问题,很简单的案例,比如银行取钱问题。同步 方法: Java的每一个对象都有一个内部锁,如果一个方法用synchronized关键字声明,那么对象的锁将保护整个方法。也就是说,要调用该方法,线程必须获得内部的对象锁。 同步代码块 在方法中,只有某些地方需要加锁 那么就可以使用同步代码块。而不是全部加锁。但很多人都说同步代码块非常脆弱,这点并不是很理解?

> ### 静态的 > 1. **静方法** > **`static`**方法一般称作静态方法,由于静态方法不依赖于任何对象就可以进行访问,因此对于静态方法来说,是没有`this`的,因为它不依附于任何对象,既然都没有对象,就谈不上`this`了。 > > ```java > public class StaticTest { > public static void a(){ > } > public static void main(String [] args){...

1. 多窗口的支持。 2. JIT/Aot编译 (主要是为了提高app的性能,android4.4开发者选项里第一次加入了aot,目的是为了在安装时进行一次编译,优化应用的使用,从而避免了每次使用都要编译与转义。而android7.0开始,新增了 JIT编译器,目的是为了对aot代码进行分析,从而不断提高app的性能) 3. 及对电池的进一步优化,在Android6.0就可以看出改变了。(一直到Androd 9.0从未停止) 4. 增强了通知栏。(样式变化,可直接回复。。。。好像还有几个。。。) 5. 多进程(多进程WebView) 6. new Emojis新的表情 7. 支持VR 8. 支持APP的快速安装

> 1. 多窗口的支持。 > 2. JIT / Aot编译(主要是为了提高app的性能,android4.4开发者选项里第一次加入了aot,目的是为了在安装时进行一次编译,优化应用的使用,从而避免了每次使用都要编译与转义。而android7.0开始,新增了JIT编译器,目的是为了对aot代码进行分析,从而不断提高app的性能) > 3. 及对电池的进一步优化,在Android6.0就可以看出改变了。(一直到Androd 9.0从未停止) > 4. 增强了通知栏。(样式变化,可直接回复....好像还有几个...) > 5. 多进程(多进程web视图) > 6. 新的Emojis新的表情 > 7. 支持VR > 8. 支持APP的快速安装 等等还有很多...

这个吧,如果单纯看性能 Frgament>LinearLayout>RelativeLayout 很多东西,上面的大佬们已经说过了,我就补充一点,及对一点优化的建议。 View在绘制的时候,RelativeLayout会对子View做两次measure。这是由于RelativeLayout是基于相对位置的,而且子View会在横向和纵向两个方向上分布,因此,需要在横向和纵向分别进行一次measure过程。而LinearLayout只进行纵向或横向的测量,所以measure的时间会比RelativeLayout少很多。但是如果设置了 weight,在测量的过程中,LinearLayout会将设置过weight的和没设置的分别测量一次,这样就导致measure两次。所以我们一般再使用时如果布局很复杂,那么建议使用RelativeLayout减少层级。也推荐使用include引入布局。 LinearLayout的好处就是可以进行适配屏幕,也是因为它可以用比例来卡,所以我们在使用时,具体使用场景由我们的布局来定吧。 4/20 修改回答

> 如果不考虑布局的排版要求,那肯定是的FrameLayout大于LinearLayout中,LinearLayout中和RelativeLayout的相差无几。 > > 1. FrameLayout中的子元素都堆在屏幕的左上角,子元素不能指定位置,绘制起来当然效率高 > .2。在阅读RelativeLayout和LinearLayout的源码中,我发现有这么一段注释: > //所以,而不是跑步代码两次,我们只是 > 将宽度设置为“默认显示宽度” 我们没有运行代码两次,而是将宽度设置为“默认显示宽度” > 楼上说的都是RelativeLayout会绘制两次,这到底是怎么回事??? > @Petterpx @Moosphan @kongxiaoan 首先很抱歉,我上面的回答有误,实际上应该是 测量(Measure)两次,回到原因上面,是因为: RelativeLayout会对子View做两次measure。这是由于RelativeLayout是基于相对位置的,而且子View会在横向和纵向两个方向上分布,因此,需要在横向和纵向分别进行一次measure过程。而LinearLayout只进行纵向或横向的测量,所以measure的时间会比RelativeLayout少很多。但是如果设置了 weight,在测量的过程中,LinearLayout会将设置过weight的和没设置的分别测量一次,这样就导致measure两次。