• RxJava设计原理解析<3>

    = 842

    本文出自:【InTheWorld的博客】

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

    image

    &n[……]

    Read more

  • RxJava设计原理与解析<2>

    = 533

    本文出自:【InTheWorld的博客】

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

    • map算子的原理

    image

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

    Read more

  • RxJava设计原理与解析<1>

    = 771

    本文出自:【InTheWorld的博客】

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

    • RxJ[……]

    Read more

  • 表达式之运算顺序与求值顺序

    = 729
    • C/C++中的情况

    写这篇水文的缘由是技术群里的一个同学提出的问题,可能是什么笔试题目吧!内容很简单,求表达式(++a) + (++a) + (a++)的值,其中a=5。对于这个问题,估计大部分同学都会给出20这个答案,我也是这么想的。在Java中,这个表达式的答案也确实是20。可惜这个题目的背景是C/C++,问题好像不是那么简单了,VC6给出的答案是22。开始我没有仔细算,猜测是C/C++在处理算术表达式的时候使用了某种自顶向下的文法。为了消除左递归,表达式求值的时候是按照从右到左的顺序处理的。但是,这样也不能解释VC6给出的答案,这种求值顺序的答案应该是21才对。

    理论分析吃瘪,我决[……]

    Read more

  • Qt on Windows实现解析

    = 866

    就窗口系统而言,我对C/S架构的更为熟悉一些。以前看过基于X window的一些实现,比如qtopia以及其他一些嵌入式窗口系统。C/S架构的GUI系统的结构比较清晰。其中,窗口服务器负责监听输入时间、屏幕绘制以及窗口状态维护,应用程序负责接收服务器的消息并进行处理、并把状态改变反馈给窗口服务器等。

    但是,Windows窗口系统使用的却是基于共享库的实现方式。共享库中保存着所用图形客户端的窗口信息,共享库和每一个客户端程序都运行在同一个进程中。基于共享库的图形系统具有响应速度快、资源开销小的优点,这也是Windows窗口系统表现非常优秀的原因。这种窗口系统带来的问题就是对共享信息访问的安全性[……]

    Read more

  • Android图形系统之Activity构成原理

    = 1193

    Android_View

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

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

    DecorView

    DecorView是Activity的根视图,从上图可以看出Deco[……]

    Read more

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

    = 906

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

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

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

    Glide.with(this.getApplicationContext())
    .load(url)
    .asBitmap()
    .diskCacheStrategy(DiskCacheStrategy.ALL)
    [......]

    Read more

  • Java Annotation——由butterknife想到

    = 840

    butterknife是Android开发中应用非常广泛的一个库。butterknife库主要利用了Java中的注解功能,可以提高Android应用的开发效率,毕竟没几个人会喜欢写那种冗长乏味的页面布局、事件连接的代码。首先,还是给一个典型的butterknife使用代码:

        @BindView(R.id.btn)
        TextView mBtn;

    这两行代码,就实现了把布局文件与TextView连接起来的功能,看起来确实非常简单。那么这么方便的功能是如何实现的呢?首先,还是看一个简答的例子,代码如下:

    SimpleAnnotation.java
    package basicT[......]

    Read more

  • 并发设计模式:Actor-based与Task-based

    = 1093

    前面一段时间,瞄了一下《七周七并发模型》。感叹还是有很多语言不会,导致有的章节现在还没法看。但是,Actor并发模型还是给我留下了比较深的印象,因为它适合应用于分布式架构,而且具有很好的容错性。和Actor-based相对应的模型就是Task-based。

    Actor-based与Task-based的含义

    Actor-based和Task-based的含义要从”计算“的内涵说起,”计算“包含两个要素:

    • 用来进行工作的线程
    • 进行工作所需的信息

    因为,线程主动地对信息进行计算处理,所以我们把线程作为计算的“主体”,把信息作为计算的“客体”。对应到并发模型中,Actor-base[……]

    Read more

  • 多线程程序之线程私有数据

    = 932

    在C/C++的多线程程序中,所有的线程共享相同的地址空间。所以数据段和进程堆的数据,都可以被所有线程读写。在极端情况下,线程的栈空间也可以被共享。只有线程的寄存器上下文算是真正私有的。对于某些变量,我们希望它在不同的线程中具有不同的值,这就是线程私有数据的用途。

    对于普通的全局变量,或者通过指针或引用实现的共享,其实在内存中只存在一个备份。而进程私有数据则相当于一种Map型的变量,根据线程的id,线程私有变量对应于不同的值。

    /*
     * tsd_once.c
     *
     * Demonstrate use of pthread_once to initialize something
     * e[......]

    Read more

第 5 页,共 8 页« 最新...34567...最旧 »