在安卓上使用RxJava

如果你做过Android(和Java)的开发,很有可能已经听说过RxJava了。RxJava是由Netflix开发的响应式扩展(Reactive Extensions)的Java实现。引用MSDN上对它的定义,Reactive Extensions是这样一个第三方库:它结合了可观察集合和LINQ式查询以达到异步和基于事件的编程效果。Netflix将这个库托管到了Github上,支持Java6以上的版本并且使它可以用于Android App开发。

本篇是介绍RxJava和Android的系列文章的第一篇,将会介绍如何在Android中使用RxJava observables(基于Square的Retrofit组件)创建REST API客户端。

我们从添加所需的库文件开始。如果你用Maven的话,只需将下面的dependencies(依赖库)加到pom.xml中即可:

`<dependency>`
`<groupId>com.squareup.retrofit</groupId>`
`<artifactId>retrofit</artifactId>`
`<version>1.2.2</version>`
`</dependency>`
`<dependency>`
`<groupId>com.netflix.rxjava</groupId>`
`<artifactId>rxjava-android</artifactId>`
`<version>0.14.6</version>`s
`</dependency>`

深入浅出RxJava(四:在Android中使用响应式编程)

在第123篇中,我大概介绍了RxJava是怎么使用的。下面我会介绍如何在Android中使用RxJava.

RxAndroid

RxAndroid是RxJava的一个针对Android平台的扩展。它包含了一些能够简化Android开发的工具。

首先,AndroidSchedulers提供了针对Android的线程系统的调度器。需要在UI线程中运行某些代码?很简单,只需要使用AndroidSchedulers.mainThread():

retrofitService.getImage(url)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(bitmap -> myImageView.setImageBitmap(bitmap));

深入浅出RxJava(三:响应式的好处)

英文原文

译文原文

在第一篇中,我介绍了RxJava的基础知识。第二篇中,我向你展示了操作符的强大。但是你可能仍然没被说服。这篇里面,我讲向你展示RxJava的其他的一些好处,相信这篇足够让你去使用Rxjava.

到目前为止,我们都没怎么介绍onComplete()和onError()函数。这两个函数用来通知订阅者,被观察的对象将停止发送数据以及为什么停止(成功的完成或者出错了)。

下面的代码展示了怎么使用这两个函数:

Observable.just(``"Hello, world!"``)
.map(s -> potentialException(s))
.map(s -> anotherPotentialException(s))
.subscribe(``new` `Subscriber<String>() {        
    @Override
    public void onNext(String s) { System.out.println(s); }        
    @Override
    public void onCompleted() { System.out.println(``"Completed!"``); }        
    @Override
    public void onError(Throwable e) { System.out.println(``"Ouch!"``); }
});

深入浅出RxJava(二:操作符)

译文原文 http://blog.csdn.net/lzyzsd/article/details/44094895

英文原文 Grokking RxJava, Part 2: Operator, Operator

第一篇blog中, 我介绍了RxJava的一些基础知识,同时也介绍了map()操作符。当然如果你并没有意愿去使用RxJava我一点都不诧异,毕竟才接触了这么点。看完 这篇blog,我相信你肯定想立即在你的项目中使用RxJava了,这篇blog将介绍许多RxJava中的操作符,RxJava的强大性就来自于它所定 义的操作符。

首先先看一个例子:

假设我有这样一个方法:
这个方法根据输入的字符串返回一个网站的url列表(啊哈,搜索引擎)

Observable<List<String>> query(String text);

现在我希望构建一个健壮系统,它可以查询字符串并且显示结果。根据上一篇blog的内容,我们可能会写出下面的代码:

query(``"Hello, world!"``)
.subscribe(urls -> {
for (String url : urls) {
System.out.println(url);
}
});

Q2季度目标

1、完成GankAPP,并上线

未完成的部分
1、上啦下拉更新 
2、替换历史上今天的API
3、优化webview的显示
4、优化代码结构(网络请求**)

深入浅出RxJava(一:基础篇)

英文原文

译文原文

RxJava正在Android开发者中变的越来越流行。唯一的问题就是上手不容易,尤其是大部分人之前都是使用命令式编程语言。但是一旦你弄明白了,你就会发现RxJava真是太棒了。
这里仅仅是帮助你了解RxJava,整个系列共有四篇文章,希望你看完这四篇文章之后能够了解RxJava背后的思想,并且喜欢上RxJava。

RxJava最核心的两个东西是Observables(被观察者,事件源)和 Subscribers(观察者)。Observables发出一系列事件,Subscribers处理这些事件。这里的事件可以是任何你感兴趣的东西 (触摸事件,web接口调用返回的数据。。。)

一个Observable可以发出零个或者多个事件,知道结束或者出错。每发出一个事件,就会调用它的Subscriber的onNext方法,最后调用Subscriber.onNext()或者Subscriber.onError()结束。

Rxjava的看起来很想设计模式中的观察者模式,但是有一点明显不同,那就是如果一个Observerble没有任何的的Subscriber,那么这个Observable是不会发出任何事件的。

Hello World

谷歌官方出的一套关于 Android 架构的实例参考

原文 github.com

The Android framework offers a lot of flexibility when it comes to defining how to organize and architect an Android app. This freedom, whilst very valuable, can also result in apps with large classes, inconsistent naming and architectures (or lack of) that can make testing, maintaining and extending difficult.

Android Architecture Blueprints is meant to demonstrate possible ways to help with these common problems. In this project we offer the same application implemented using different architectural concepts and tools.

You can use these samples as a reference or as a starting point for creating your own apps. The focus here is on code structure, architecture, testing and maintainability. However, bear in mind that there are many ways to build apps with these architectures and tools, depending on your priorities, so these shouldn’t be considered canonical examples. The UI is deliberately kept simple.

What does beta mean?

We’re still making decisions that could affect all samples so we’re keeping the initial number of variants low before the stable release.

Samples

All projects are released in their own branch. Check each project’s README for more information.

从案例学习RxAndroid

原文链接

如果你在阅读这篇文章,相信你一定很想了解RxJava以及如何在Android应用中使用它。可能你已经见过RxJava的代码了,但仍然有些疑惑,愿你能在这篇文章里找到答案。

当我第一次使用RxJava的时候我只是在照搬代码,这些代码能跑起来,但是我对RxJava的基础部分仍然存在误解,而且我找不到好的源码来学习。所以为了理解RxJava,我不得不一点一点学习,踩了不少坑。

为了不让你把我踩过的坑再踩一遍,我会基于我的学习成果写一些例子出来,目的就是让你能够对RxJava有足够的了解,并能在你的Android应用中使用它。

源码可以在这里找到。在每个例子的开始,我会写清每个代码段是属于哪个Activity的。我会将本文分为两个部分,在前三个例子里,我会着重讲解如何用RxJava异步加载数据;在后三个例子里,我会探索一些更高级的用法。

在开始说代码之前,先澄清几个概念。RxJava最核心的东西就是Observable和Observer。Observable会发出数据,而与之相对的Observer则会通过订阅Observable来进行观察。

Observer可以在Observable发出数据、报错或者声明没有数据可以发送时进行相应的操作。这三个操作被封装在Observer接口中,相应的方法为onNext(),onError()和onCompleted()。

明确了这些概念以后,让我们来看一些例子。

Android小经验

原文出处:http://jayfeng.com/

做Android久了,就会踩很多坑,被坑的多了就有经验了,闲暇之余整理了部分,现挑选一些重要或者偏门的“小”经验做个记录。

查看SQLite日志

adb shell setprop log.tag.SQLiteLog V

adb shell setprop log.tag.SQLiteStatements V

因为实现里用了Log.isLoggable(TAG, Log.VERBOSE)做了判断,LessCode的LogLess中也参考了这种机制:LogLess
使用这种方法就可以在Release版本也能做到查看应用的打印日志了。

PNG优化

APK打包会自动对PNG进行无损压缩,如果自行无损压缩是无效的。
当然进行有损压缩是可以的:https://tinypng.com/

Tcpdump抓包

Android开发代码片段

1、获取电源锁

public static void acquireWakeLock() {
    unlockKeyBoard();
    try {
        if (null == mWakeLock) {
            PowerManager pm = (PowerManager) BaseApplication.getInstance()
                    .getSystemService(Context.POWER_SERVICE);
            try {
                mWakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK
                        | PowerManager.ACQUIRE_CAUSES_WAKEUP
                        | PowerManager.ON_AFTER_RELEASE, "PushMessageReceiver"); // |
                                                                                    // PowerManager.ON_AFTER_RELEASE
            } catch (Exception e) {
                DbUtils.exceptionHandler(e);
            }
        }
        if (null != mWakeLock) {
            mWakeLock.acquire();
        }
    } catch (Exception e) {
        DbUtils.exceptionHandler(e);
    }
}

Android开发工作中的细节

  1. 全部 Activity 可继承自 BaseActivity,便于统一风格与处理公共事件,构建对话框统一构建器的建立,万一需要整体变动,一处修改到处有效。

  2. 数据库表段字段常量和 SQL 逻辑分离,更清晰,建议使用 Lite 系列框架 LiteOrm 库,超级清晰且重心可以放在业务上不用关心数据库细节。

  3. 全局变量放全局类中,模块私有放自己的管理类中,让常量清晰且集中.

  4. 不要相信庞大的管理类的东西会带来什么好处,可能是一场灾难,而要时刻注意单一职责原则,一个类专心做好一件事情更为清晰。

日常使用到的梯子

日常生活中,由于天朝的局域网的限制,很多网站都无法进行使用,虽然国内也有替代的网站,但是作为开发人员来讲,这些事远远不够的,现在就讲我个人在生活工作中使用到梯子,进行总结一下

PC端

##全局梯子
目前在PC上(window)使用到的全局的梯子 就是 赛风和VPN Gate

赛风

如果能够直接访问 直达

简单介绍

赛风是赛风公司的一款新翻墙工具,利用VPN, SSH和HTTP代理软件提供未经审查的访问互联网。赛风的客户端将自动寻找新的接入点,力求最大限度的绕过网络审查。

Android小知识库

这份是我工作以来,总结的小知识库,有些知识点现在看来太LOW了,把还觉得有用的分享出来!

Genymotion下载虚拟镜像Connection timeout

Add new device出现的问题:

Failed to deploy virtual device.
Unable to create virtual device.Connection timeout occurred.

解决方案:

1
2
3
4
5
6
当选择Google Nexus 5 - 6.0.0 - API 23 - 1080x1920下载device失败后,到C:\Users\用户主目录\AppData\Local\Genymobile\Genymotion\ova下看到genymotion_vbox86p_6.0_160114_090449.ova,大小却是0KB,在C:\Users\用户主目录\AppData\Local\Genymobile\genymotion.log,打开该文件,找到类似

“http://files2.genymotion.com/dists/6.0.0/ova/genymotion_vbox86p_6.0_160114_090449.ova”路径,即您想要下载的镜像文件URL;`

用迅雷去下载,下载完成后放到C:\Users\用户主目录\AppData\Local\Genymobile\Genymotion\ova;
重新点击Google Nexus 5 - 6.0.0 - API 23 - 1080x1920去下载,验证安装后即会显示在设备列表中。

Lambda for Android

Lambda,它让代码看起来更加简洁,但个人认为代码的可读性差了很多,因此一直没有去深入学习。

什么是lambda

lambda是一种匿名表达式,retrolambda使得Android能使用lambda特性,举个例子:

view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d("wxl", "retrolambda test");
}
});

使用 lambda

view.setOnClickListener(
v -> Log.d("wxl", "retrolambda test"));

Android如何使用

这里是使用Retrolambda的gradle插件,这样就可以在代码中使用lambda了。

理解Android编译命令

工欲善其事,必先利其器,对于想要深入学习Android源码,必须先掌握Android编译命令.

关于Android Build系统,这个话题很早就打算整理下,迟迟没有下笔,决定跟大家分享下。先看下面几条指令,相信编译过Android源码的人都再熟悉不过的。

source /opt/android1204_17.conf
source setenv.sh
lunch
make -j12

Webview上传文件的那些坑

要说Android中最厉害的组件莫过于Webview 了,夸张点说把这个组件放在屏幕上就可以算作一个简单地浏览器应用了。但你若认为这就万事大吉了,可太小看Webview这个磨人的妖精了,下面单就上传文件的这个坑来做展开。

Android源码编译和内核编译

源码编译

1、系统: Ubuntu14.04以上 或者 Mac

下面的介绍都是在ubuntu下进行的

2、JdK安装

$ sudo add-apt-repository "deb http://archive.canonical.com/ lucid partner"
$ sudo apt-get update
$ sudo apt-get install sun-java8-jdk

Kotlin 1.0 正式版发布啦

就在昨天,Android领域的Swift–Kotlin 1.0发布了,详细的新版本发布介绍请「阅读原文」查看官方发行说明。

何为Kotlin?

Kotlin 是一门实用的编程语言,可用于 JVM 和 Android 程序开发,Kotlin 结合了面向对象和函数式特性,致力于互操作性,安全,简洁和工具支持。

Kotlin 是一门通用的语言,只要能用 Java 的地方就能用 Kotlin,包含:服务器程序开发,移动应用开发(Android),桌面客户端程序开发。 Kotlin 支持所有主要的开发工具以及服务,比如:

IntelliJ IDEA,Android Studio 和 Eclipse
Maven, Gradle 和Ant
Spring Boot(Kotlin 支持今天正式发布!)
GitHub,Slack,甚至 Minecraft

Ibeacon

是什么?

iBeacon是apple公司提出的“一种可以让附近手持电子设备检测到的一种新的低功耗、低成本信号传送器”的一套可用于室内定位系统的协议。 这种技术可以使一个智能手机或其他装置在一个iBeacon基站的感应范围内执行相应的命令。

这是帮助智能手机确定他们大概位置或环境的一个应用程序。在一个iBeacon基站的帮助下,智能手机的软件能大概找到它和这个iBeacon基站的相对位置。iBeacon能让手机收到附近售卖商品的通知,也可以让消费者不用拿出钱包或信用卡就能在销售点的POS机上完成支付。iBeacon技术通过低功耗蓝牙(BLE),也就是我们所说的智能蓝牙来实现。

iBeacon为利用低功耗蓝牙可以近距离感测的功能来传输通用唯一识别码的一个app或操作系统。 这个识别码可以在网上被查找到用以确定设备的物理位置或者可以在设备上触发一个动作比如在社交媒体签到或者推送通知。

各种供应商创造了不同形式的iBeacon硬件设备,包括小硬币电池设备,随身碟和蓝牙4.0通用加密狗。