Android 测试 (五)-- 实战分析

通过一个邮箱的开源项目分析如果对一个项目进行 android 测试。

项目地址我在文章http://xuyushi.github.io/2016/06/18/Android%20APP%20%E6%96%B0%E6%A1%86%E6%9E%B6/ )中已经对这个项目的框架进行了解析,不熟悉的可以看这里

改项目采用的是 Rxjava + retrofit + dagger2 + mvp 的框架。测试采用的是 unit + dagger + robolectric ,unit test 测试 mvp 中 P层的依赖

2016/11/13 posted in  Android

Android 测试 (三)--Local Unit Tests

如果你的单测程序没有或者只有少量的 Android 依赖,你应该在你的本地开发环境中运行你的测试程序。因为这种方法可以避免每次将测试代码加载到物理设备或者模拟器上运行,所以测试效率比较高。执行单元测试的时间大大减少。你可以使用 mock 框架比如 Mockito 来解决一些依赖关系

Read more   2016/11/6 posted in  Android

Android 测试 (二)--Instrumented Unit

Instrumented 单元测试运行在物理设备或者模拟器上。他能使用 Android api 和一些 support api,例如 Android Testing Support Library。如果需要获取 instrumentation 信息(例如需要 app 的 context)或者需要 Android 框架里的一些组件(比如 Parcelable 或 SharedPreferences 对象),可以使用Instrumented 单测

使用Instrumented单元测试也有助于减少编写和维护mock 代码的工作量。如果你选择mock 的话,可以使用一个模仿的框架来mock 任何依赖关系。

Read more   2016/11/5 posted in  Android

Android 测试 (一)--测试总览

android 测试基于 Junit,我们既可以在 JVM 运行单元测试,也可以在 Android 设备上运行功能测试

测试类型

当使用 Android studio 来写测试程序时,你的代码必须放在两个指定的文件夹中。

Local unit testsWARNING: No manifest file found at ./AndroidManifest.xml.

Falling back to the Android OS resources only.
To remove this warning, annotate your test class with @Config(manifest=Config.NONE).
位于 module-name/src/test/java/.
这些测试时运行在本地 JVM,没有运行 Android framework API的权限

Read more   2016/11/5 posted in  Android

Window 和 WindowManager

概述

window

  • window 是一个抽象类,具体实现是PhoneWindow
  • window 也是一个抽象的概念,每个 window 内对应这一个 DecorView 和一个 ViewRootImplwindowDecorView 通过ViewRootImpl联系。 # WindowManager WindowManager 是 外界访问 Window 的入口
Read more   2016/9/16 posted in  Android

window、Activity、DecorView、ViewRoot关系

简介

  • Activity并不负责视图控制,它只是控制生命周期和处理事件,真正控制视图的是Window。一个Activity包含了一个Window,Window才是真正代表一个窗口,Window 中持有一个 DecorView,而这个DecorView才是 view 的根布局

  • DecorView是FrameLayout的子类,它可以被认为是Android视图树的根节点视图。DecorView作为顶级View,一般情况下它内部包含一个竖直方向的LinearLayout,在这个LinearLayout里面有上下两个部分(具体情况和Android版本及主体有关),上面的是标题栏,下面的是内容栏。在Activity中通过setContentView所设置的布局文件其实就是被加到内容栏之中的,而内容栏的id是content,在代码中可以通过ViewGroup content = (ViewGroup)findViewById(R.android.id.content)来得到content对应的layout。

Read more   2016/9/15 posted in  Android

AsyncTask 源码分析

简介

AsyncTask enables proper and easy use of the UI thread. This class allows to perform background operations and publish results on the UI thread without having to manipulate threads and/or handlers.
主要是为了在后台线程中做操作时更新 UI 的

Read more   2016/9/3 posted in  Android

Runnable、Callable、Future、FutureTask的区别

Runnable(interface)

/**
 * Represents a command that can be executed. Often used to run code in a
 * different {@link Thread}.
 */
public interface Runnable {

    /**
     * Starts executing the active part of the class' code. This method is
     * called when a thread is started that has been created with a class which
     * implements {@code Runnable}.
     */
    public void run();
}

run()方法返回值为void类型,所以在执行完任务之后无法返回任何结果。

Read more   2016/8/21 posted in  Android

Looper、Handler、Message 源码分析

Looper

文档这么介绍这个类的

  • Class used to run a message loop for a thread. Threads by default do
    • not have a message loop associated with them; to create one, call
    • {@link #prepare} in the thread that is to run the loop, and then
    • {@link #loop} to have it process messages until the loop is stopped.

通常在线程中是这样使用

Read more   2016/8/20 posted in  Android

HandlerThread 源码 分析

HandlerThread

首先文档对这个类的介绍

Handy class for starting a new thread that has a looper. The looper can then be used to create handler classes. Note that start() must still be called.

如果我有一个耗时的任务需要放在非 UI 线程处理,一般情况下是 new 出一个 thread 来执行,然而,这样就存在一个性能问题:多次创建和销毁线程是很耗系统资源的。

Read more   2016/8/20 posted in  Android