任何一个app几乎都有图片加载的功能,目前比较主流的图片加载框架有:Fresco,Glide,Picasso,那么如何从三者中选择一个比较适合自己app的呢?今天推荐两篇3者的对比分析,有兴趣的不妨看一看。
Picasso,Glide,Fresco对比分析
http://blog.csdn.net/github_33304260/article/details/70213300
http://www.jianshu.com/p/ca5ce4444c37#
本文由tangpj投稿
tangpj的博客地址:
http://tangpj.com/archives/
原创声明: 该文章为原创文章,未经博主同意严禁转载。 简介:Java 8是在2014年3月发布的,Android工程师为什么要关心Java 8呢?理由是Java 8所做的改变比Java历史上任何一次改变都要深远。Java 8对于程序员的主要好处在于它提供了更多的编程工具和概念,能以更快,更重要的是能以更为简洁、更易于维护的方式解决新的或现有的编程问题。我希望通过这篇文章,能让读者对Java 8产生兴趣,从而使用Java 8进行开发。
如何在Android Studio上应用Java 8?
这里首先需要说明下在Android Studio(下文中使用AS代指)上使用Java 8会遇到的坑和问题。
一般我们在AS上应用Java 8的方式是通过使用Jack来进行编译,使用方法如下:
当我们使用Jack的时候会导致我们无法使用AS的Instant Run和DataBinding功能,而且不支持接口的默认方法。这不能成为我们放弃使用Java 8的理由。当我们正准备愉快地使用Java 8时,Google突然在17年3月的某一天宣布放弃Jack,对的,我们的Google又弃坑了。
不过放心,Google在AS 2.4版本中提供了对Java 8的官方支持,在AS 2.4中使用Java 8不会产生任何负面的影响。AS 2.4提供了测试版供开发者使用,如果有兴趣的话可以提前体验AS 2.4的新功能,到目前为止笔者已经愉快地使用AS 2.4开发一周多了。
AS 2.4的下载地址为:https://developer.android.com/studio/preview/index.html。
在AS 2.4中使用Java 8的方法:
android {
...
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
在回答这个问题前,我们现在看一段简单的Java代码。代码的功能是把一堆苹果按照重量进行排序。
我们先来看看苹果类代码:
public class Apple {
private int weight;
private String color;
}
对苹果按照重量进行排序:
在Java 8里,你可以编写更为简洁的代码,这些代码读起来更接近问题的描述:
apples.sort(Comparator.comparing(Apple::getWeight));
上面这段代码非常简单,它念起来就是“对苹果排序,排序的条件是苹果的重量”。如果你研究过Lambda表达式的话,上面这段代码你就能够快速读懂,如果暂时理解不了的话,也没关系,笔者会慢慢带你深入了解的。
Java 8对硬件的影响:平常我们用的CPU都是多核的,在知乎上我看到过一句话就是:大部分Android App都没有充分利用多核的性能,具体是哪个问题的哪个回答我忘了,这句话十分有道理。因为绝大多数现有Java 程序都只使用其中一个内核,其它的都闲着,或者一小部分的处理能力来运行操作系统和一些系统相关的Service。
在Java 8之前,我们必须使用多线程才能使用多个内核。问题是,线程用起来很难,也很容易出错,当线程竞争同一资源时,性能会大打折扣。Java 5添加了工业级的构建模块,如线程池和并发集合。Java 7添加了分支/合并集合框架,使得并行变得更加实用,但使用起来依然很难,并且很容易产生无法预期的错误。而Java 8对并行有了一个更简单的思路,不过在使用的使用仍然需要遵守一些规则,下面笔者会谈到。
Java从函数式编程中引入的两个核心思想:将方法和Lambda作为一等值,以及在没有可变共享时,函数或方法可以有效、安全地并发执行。
下面我们来简单介绍下Java 8的一些重要概念:
Stream API
行为参数化
接口中的默认方法
(1)流(Stream):
Stream是Java 8提供的新API,它允许你以声明性方式处理数据集合(通过查询语句来表达,而不是临时编写一个实现)。就现在来看,你可以把把他们看成遍历数据集合的高级迭代器。此外Stream还可以透明地并行处理(parallelStream方法)。
Stream API和Java 现有的Collection(集合)API的行为差不多:它们都能够访问数据项目的序列。它们的区别是:Collection主要是为了存储和访问数据,而Stream则主要用于描述对数据的运算。这里的关键点在于,Stream允许并提倡并行处理一个Stream中的元素。 如果需要处理的数据量十分庞大的话,推荐使用并行流来进行处理。
流的简短定义是:从支持数据处理操作的源生成的元素序列 。
-
元素序列就像集合一样,流也提供了一个接口,可以访问特定元素类型的一组有序值。因为集合是数据结构,所以它的主要目的是以特定的时间/空间复杂度存储和访问元素。但流的目的在于表达计算,集合讲的是数据,流讲的是计算。
-
源流会使用一个提供数据的源,如集合、数组、输入流/输出资源。从有序集合生成流时会保留原有的顺序。
-
数据处理操作流的数据处理功能支持类似于数据库的操纵,以函数式编程语言中的常用操作,如filter、map、reduce、find、match、sort等。流操作可以顺序执行,也可以并行。
流水线很多流操作本身会返回一个流,许多个操作就可以链接起来,形成一个大的流水线。流水线可以看作对数据源进行数据库式查询。
(2)流操作:
(3)行为参数化:
行为参数化,就是一个方法接受多个不同的行为作为参数,并在内部使用它们,完成不同行为的能力
行为参数化主要有以下这些特点:
在Java 8中行为参数化主要是通过Lambda表达式和函数式接口来实现的。
Lambda概念
可以把Lambda表达式理解为简洁地表示可传递的匿名函数的一种方式:它没有名称,但它有参数列表、函数主体、返回类型,可能还有可以抛出异常的列表。
匿名我们说匿名,是因为它不像普通的方法那样有一个明确的名称:写的少而想得多。
函数Lambda函数不像方法那样属于某个特定的类。但和方法一样,Lambda有参数列表、函数主体、返回类型,还可能有可以抛出的异常列表。
传递Lambda表达式可以作为参数传递给方法或存储在变量中。
注:函数式接口是指只带有一个抽象方法的接口(这里说成抽象方法主要是为了区分默认方法)。Java 8中提供了一系列通用的函数式接口供我们使用,通过使用这些系统提供的函数式接口可以避免重复定义类似接口。如:在Android中的OnClickListener接口可以使用Java 8中的Supplier\接口代替。
(4)接口中的默认方法
在Java 8之前,接口中的方法是不能带有方法实现对的,这就意味着,一旦当我们的接口发布出去后,就不能轻易更改接口。
因为更改接口会导致所有实现了该接口的类都需要更改,这会带来无法估量的问题。Java 8提供了默认方法这一特性,我们可以对方法添加默认的实现,这样一来,实现类就不必实现/覆盖这一方法。我们可以通过前面对苹果排序的代码来加深理解。
在Java 8里
apples.sort(Comparator.comparing(Apple::getWeight));
我们通过对比得知,在Java 8之前,我们需要通过Collections类sort方法来对列表进行排序。
这不符合我们的理解,因为按照人类的理解,对列表进行排序的话,应该是属于列表的方法,而不是通过引入第二个类来实现。但是在Java 8之前,由于在接口中增加方法会导致所有的实现类都报错,所以为了保证兼容性,引入了Collections来实现对列表的操作。
而在Java 8中,List接口中提供了默认方法sort,这个方法的实际效果和Collections.sort是一样的。我们可以来看看List接口中的sort方法的具体实现:
default void sort(Comparator
|