ClassCastException: android.os.BinderProxy cannot be cast

在使用bindService时遇到这个问题,反复对比网上的别人的代码,没有任何问题,直接把网上的代码复制到我的项目里也没有人任何问题,但是 直接使用我的Service就有问题,提示 ...

七月 5, 2018 · 1 分钟 · LengYue

Don’t Store Data in the Application Object

There is always some information that is needed in many places in your app. It can be a session token, the result of an expensive computation, etc. It is often tempting to avoid the overhead of passing objects between activities or keeping those in persistent storage. A pattern that is sometimes suggested is to dump your data in the Application object with the idea that it will be available across all activities....

七月 5, 2018 · 4 分钟 · LengYue

Gson中使用泛型

JSON字符串数组 ["Android","Java","PHP"] 当我们要通过Gson解析这个json时,一般有两种方式:使用数组,使用List。而List对于增删都是比较方便的,所以实际使用是还是List比较多。 数组比较简单 Gson gson = new Gson(); String jsonArray = "[\"Android\",\"Java\",\"PHP\"]"; String[] strings = gson.fromJson(jsonArray, String[].class); 但对于List将上面的代码中的 String[].class 直接改为 List.class 是行不通的。对于Java来说List 和List 这俩个的字节码文件只一个那就是List.class,这是Java泛型使用时要注意的问题 泛型擦除。 为了解决的上面的问题,Gson为我们提供了TypeToken来实现对泛型的支持,所以当我们希望使用将以上的数据解析为List时需要这样写。 Gson gson = new Gson(); String jsonArray = "[\"Android\",\"Java\",\"PHP\"]"; String[] strings = gson.fromJson(jsonArray, String[].class); List<String> stringList = gson.fromJson(jsonArray, new TypeToken<List<String>>() {}.getType()); 注:TypeToken的构造方法是protected修饰的,所以上面才会写成new TypeToken<List>() {}.getType() 而不是 new TypeToken<List>().getType() 泛型解析对接口POJO的设计影响 泛型的引入可以减少无关的代码,如我现在所在公司接口返回的数据分为两类: {"code":"0","message":"success","data":{}} {"code":"0","message":"success","data":[]} 我们真正需要的data所包含的数据,而code只使用一次,message则几乎不用。如果Gson不支持泛型或不知道Gson支持泛型的同学一定会这么定义POJO。 public class UserResponse { public int code; public String message; public User data; } 当其它接口的时候又重新定义一个XXResponse将data的类型改成XX,很明显code,和message被重复定义了多次,通过泛型的话我们可以将code和message字段抽取到一个Result的类中,这样我们只需要编写data字段所对应的POJO即可,更专注于我们的业务逻辑。如:...

七月 5, 2018 · 1 分钟 · LengYue

Java反射与动态代理

基本用法 Java 反射API的第一个主要作用是获取程序在运行时刻的内部结构。这对于程序的检查工具和调试器来说,是非常实用的功能。只需要短短的十几行代码,就可以遍历出来一个Java类的内部结构,包括其中的构造方法、声明的域和定义的方法等。这不得不说是一个很强大的能力。只要有了java.lang.Class类 的对象,就可以通过其中的方法来获取到该类中的构造方法、域和方法。对应的方法分别是getConstructor、getField和getMethod。这三个方法还有相应的getDeclaredXXX版本,区别在于getDeclaredXXX版本的方法只会获取该类自身所声明的元素,而不会考虑继承下来的。Constructor、Field和Method这三个类分别表示类中的构造方法、域和方法。这些类中的方法可以获取到所对应结构的元数据。 反射API的另外一个作用是在运行时刻对一个Java对象进行操作。 这些操作包括动态创建一个Java类的对象,获取某个域的值以及调用某个方法。在Java源代码中编写的对类和对象的操作,都可以在运行时刻通过反射API来实现。考虑下面一个简单的Java类。 class MyClass { public int count; public MyClass(int start) { count = start; } public void increase(int step) { count = count + step; } } 使用一般做法和反射API都非常简单。 MyClass myClass = new MyClass(0); //一般做法 myClass.increase(2); System.out.println("Normal -> " + myClass.count); try { Constructor constructor = MyClass.class.getConstructor(int.class); //获取构造方法 MyClass myClassReflect = constructor.newInstance(10); //创建对象 Method method = MyClass....

七月 5, 2018 · 2 分钟 · LengYue

Kotlin在Android上令人惊叹的技巧

Kotlin在Android上令人惊叹的技巧 原文链接 : Kotlin awesome tricks for Android 原文作者 : Antonio Leiva 我已经在这个Blog里讨论了很多Kotlin了,现在Google也正在讨论Kotlin,Kotlin 1.0 RC 已经发布了,毫无疑问,Kotlin不仅仅是Android的一个替代选择。Kotlin就在这里,我推荐你开始学习它。 在Android上我从哪里开始学习Kotlin? 这里已经有一些信息了,但是如果你想要真正的关注和快速学习,我推荐你这些资源: Kotlin reference:如果你想深入了解这个语言的细节,这里是你能找到的最好的地方。我所知道关于这个语言的最好参考文献之一。 This blog:这个链接是我整理的所有关于Kotlin的文章的地方。你不应该错过它,文章属于初级和中级。 Kotlin for Android Developers, The book:如果你想快速和持续的学习,这本书是最好的方法。如果你已经了解了Andriod,这将是一个在你的项目中使用kotlin的快速途径。我已经编写很长一段时间了,当新版本发布的时候我就会更新它。已经更新到了Kotlin 1.0 RC。除此之外如果你订阅了这个列表,你将收到免费的头5个章节和这本书末尾显示的一个购买折扣。 展示这个技巧 在我要讲解之前,有一个要说明的是Kotlin能给你带来简化的Android代码。这里有一组没有特定顺序的独立的例子。 ####### 简洁和趣味的编写点击监听事件 Java 7上编写监听和回调事件非常繁琐的原因是缺少了lambdas。Kotlin有非常好的lambdas和与Java库有非常好的兼容性。用lambda一个方法即可映射接口。你可以这么做: myButton.setOnClickListener { navigateToDetail() } 这就是所有。 为什么layout要如此麻烦的inflate?再也不是了! 当你在Adapter中实例化时,你需要inflate一个layout,你会这样写: LayoutInflater.from(parent.getContext()).inflate(R.id.my_layout, parent, false); 为什么父类不能inflate它自己的layout?好了,用Kotlin你可以。可以创建一个扩展的方法为你所用: fun ViewGroup.inflate(@LayoutRes layoutRes: Int, attachToRoot: Boolean = false): View { return LayoutInflater....

七月 5, 2018 · 3 分钟 · LengYue

RelativeLayout与LinearLayout性能上的比较

首先必须明确: RelativeLayout 性能可未必比LinearLayout高 LinearLayout 性能也未必比RelativeLayout高 不同场景下,性能各有差异。 RelativeLayout在onMeasure 的时候,每个子View都得测量两次的。 所以View树越顶部,越不应该使用RelativeLayout,当然也不应该使用LinearLayout的权重(weight)属性,因为它也会导致测量两次以上。 如果当前布局在View树的底部,那就可以遵循扁平化布局的设计原则。 所以没有绝对的,得根据你的UI设计的结构来决定到底使用哪个。 为什么有些人说,LinearLayout的性能好,另一些人说RelativeLayout好,当然这是有前提的。LinearLayout在不使用weight属性的情况下,越靠近树的顶部,子View越多,性能比RelativeLayout越高。 那么如何选择:其实就围绕着 1、子View数量,嵌套关系。 2、该节点在View树的位置。这两点来综合考虑

七月 5, 2018 · 1 分钟 · LengYue

RxJava操作符分类

ReactiveX的每种编程语言的实现都实现了一组操作符的集合。不同的实现之间有很多重叠的部分,也有一些操作符只存在特定的实现中。每种实现都倾向于用那种编程语言中他们熟悉的上下文中相似的方法给这些操作符命名。 本文首先会给出ReactiveX的核心操作符列表和对应的文档链接,后面还有一个决策树用于帮助你根据具体的场景选择合适的操作符。最后有一个语言特定实现的按字母排序的操作符列表。 如果你想实现你自己的操作符,可以参考这里:实现自定义操作符 创建操作 用于创建Observable的操作符 Create — 通过调用观察者的方法从头创建一个Observable Defer — 在观察者订阅之前不创建这个Observable,为每一个观察者创建一个新的Observable Empty/Never/Throw — 创建行为受限的特殊Observable From — 将其它的对象或数据结构转换为Observable Interval — 创建一个定时发射整数序列的Observable Just — 将对象或者对象集合转换为一个会发射这些对象的Observable Range — 创建发射指定范围的整数序列的Observable Repeat — 创建重复发射特定的数据或数据序列的Observable Start — 创建发射一个函数的返回值的Observable Timer — 创建在一个指定的延迟之后发射单个数据的Observable 变换操作 这些操作符可用于对Observable发射的数据进行变换,详细解释可以看每个操作符的文档 uffer — 缓存,可以简单的理解为缓存,它定期从Observable收集数据到一个集合,然后把这些数据集合打包发射,而不是一次发射一个 latMap — 扁平映射,将Observable发射的数据变换为Observables集合,然后将这些Observable发射的数据平坦化的放进一个单独的Observable,可以认为是一个将嵌套的数据结构展开的过程。 roupBy — 分组,将原来的Observable分拆为Observable集合,将原始Observable发射的数据按Key分组,每一个Observable发射一组不同的数据 ap — 映射,通过对序列的每一项都应用一个函数变换Observable发射的数据,实质是对序列中的每一项执行一个函数,函数的参数就是这个数据项 can — 扫描,对Observable发射的每一项数据应用一个函数,然后按顺序依次发射这些值 indow — 窗口,定期将来自Observable的数据分拆成一些Observable窗口,然后发射这些窗口,而不是每次发射一项。类似于Buffer,但Buffer发射的是数据,Window发射的是Observable,每一个Observable发射原始Observable的数据的一个子集 过滤操作 这些操作符用于从Observable发射的数据中进行选择 Debounce — 只有在空闲了一段时间后才发射数据,通俗的说,就是如果一段时间没有操作,就执行一次操作 Distinct — 去重,过滤掉重复数据项 ElementAt — 取值,取特定位置的数据项 Filter — 过滤,过滤掉没有通过谓词测试的数据项,只发射通过测试的 First — 首项,只发射满足条件的第一条数据 IgnoreElements — 忽略所有的数据,只保留终止通知(onError或onCompleted) Last — 末项,只发射最后一条数据 Sample — 取样,定期发射最新的数据,等于是数据抽样,有的实现里叫ThrottleFirst Skip — 跳过前面的若干项数据 SkipLast — 跳过后面的若干项数据 Take — 只保留前面的若干项数据 TakeLast — 只保留后面的若干项数据 组合操作 组合操作符用于将多个Observable组合成一个单一的Observable...

七月 5, 2018 · 2 分钟 · LengYue

sublime-text 简单的安装方式

小巧、高效、强大到逆天的编辑器,相比之下gedit,notepad++简直弱爆了。 但是它不支持中文输入,之前介绍了如何让他支持中文输入,但是需要自己去编译,很麻烦。 <br> 近日发现一个简单的安装方式,直接支持中文和fcitx sudo apt-get install git git clone https://github.com/stkevintan/sublpatcher.git &&cd sublpather ./install 大概这样就OK。。 顺利的话界面已汉化,且完美支持fcitx。 主程序位置 /opt/sublime_text_2/ 卸载方式 sudo apt-get remove sublime-text

七月 5, 2018 · 1 分钟 · LengYue