• RxJava设计原理解析<3>

    本文出自:【InTheWorld的博客】

        在上一篇blog中,我们主要讨论了一些关于map和flatMap实现方面的知识。但是flatMap远比map复杂,flatMap涉及了merge算子方面的东西。所以这篇博文将重点分析merge算子的实现原理。merge算子的功能是把多个Observable整合到一起,并创建一个新的Observable。听起来这个功能其实并不是很难理解,merge就像两江交汇一般,把各支流的水汇聚到一起。《Learning Reactive Programming》一书中有非常形象的配图。下图就描述了merge的功能:

    image

        从视觉上就能看得出来,merge与flatMap非常相似,而这也是flatMap底层使用merge实现的原因。一个例子让你明白flatMap的作用,代码如下。

         int threadCt = Runtime.getRuntime().availableProcessors()
    【查看更多】
  • RxJava设计原理与解析<2>

    本文出自:【InTheWorld的博客】

    在上一篇blog中,我们通过一个简单的例子探索了RxJava的设计原理。而这篇博客的主要内容是研究RxJava的高阶算子。然而,RxJava中的高阶算子非常之多,每一个分析是不太现实的。所以,这篇文章的内容主要以map和flatMap为例,分析一下RxJava中算子的实现方式。

    • map算子的原理

    image

    有过函数式编程语言学习经验的同学大概对map算子都不会感到陌生。即使没有学习过functional programming,也大概听过MapReduce。map算子的功能是把一个值作为输入,对应地输出一个值,实现了
    “一一映射”的功能。在RxJava中,map的简单用法如下:

     Observable simple = Observable.just( 2, 3, 5, 8);
        Observable duplicate = simple.map(v -2*v);
        duplicate.subscribe(
    【查看更多】
  • RxJava设计原理与解析<1>

    本文出自:【InTheWorld的博客】

    RxJava即Reactive Java,是响应式编程范式在Java上的一种实现。响应式编程范式的目标是,提高程序的容错性、降低软件模块的耦合性、提高程序相应速度。到目前为止,几乎所有主流语言都有相应的reactive库。其中,RxJava在android的开发中,应用的非常广泛。我使用RxJava也有一两个月了,期间断断续续的学习了RxJava。坦诚的说,刚开始的时候确实有点晕。首先,这种相应式的编程范式确实比较新颖,其次,我很好奇RxJava背后的实现原理,但一时间又想不通。既然想不通,我就打算看源码来分析,所以就有了这篇blog。

    • RxJava基本用法的实现

    这里所说的基本用法是指,只使用Observable、Observer,而不使用其他高阶运算符的用法。毕竟研究问题,还是由浅入深相对容易理解。首先研究下面这个例子:

            Observable
    【查看更多】
  • Android图形系统之Activity构成原理

    Android_View

    Activity是Android图形系统中非常重要的组成部分。图形系统客户端——Android应用程序的多数功能都是通过Activity实现的。上图展示了Activity类的构成,Activity主要由Window(phoneWindow的抽象基类)和WindowManager两部分构成。Window主要负责Activity的窗口视图,而WindowManager则主要负责与WmS交互。

    在这篇博客中,我不打算详细深入窗口视图的实现或者WmS的细节,而是比较宏观的梳理一下Activity的脉络。

    DecorView

    DecorView是Activity的根视图,从上图可以看出DecorView继承与ViewGroup。而ViewGroup的结构是大家都比较熟悉的,如下图所示。这… 【查看更多】

  • Android开发中的一些零散纪录

    最近一段时间,主要是在解一些bug,所以精力都分散在了不同的问题上。也是很久一段时间没有写blog了,这里记录一下最近debug过程中的一些知识点。

    1. 使用CircleImageView时,Glide第一次无法加载出正常的图片

    这个 bug的具体原因,我还不太清楚,留到以后再探讨了。后来参考StackOverflow上的回答解决了问题。主要的代码片段如下

    Glide.with(this.getApplicationContext())
    .load(url)
    .asBitmap()
    .diskCacheStrategy(DiskCacheStrategy.ALL)
    .placeholder(R.drawable.default_avatar)
    .into(new SimpleTarget<Bitmap>() {
    @Override
    public void onResourceReady(Bitmap
    【查看更多】
  • 安卓-指南针

    这个安卓指南针其实是《Learning Android》一书中的一个例子,但是由于api的变更,代码在新版本中是不能通过编译的。我查找了一些新版本的资料,把原书中的例子更新了一下,发现结果也不太对。程序运行时,指针一直不停的抖动,根本没有实现方向定位的功能。究其原因还是对api的没有了解透彻。实现定位功能的代码如下:

        public void onSensorChanged(SensorEvent event) {
            if(event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
                accelerometerValues = event.values;
                Log.i("Compass","Got acceleration: " + event.values[0] +"   "+ event.values[1] +" " + event.values[2]);
            }
            if(event.sensor.getType()
    【查看更多】