/ Posts / 总共301篇

蓄力2.0 我为公司提建议共谋发展

迪尔西的小伙伴好, 我来到迪尔西已经半年了,从最初的不熟悉不了解到现在已经能看明白很多事情了,所以借着蓄力2.0的启动想表达一下我个人的一些想法和建议,希望对公司的2.0时代能尽一些我的微薄之力。

先谈感受

首先说说我们的大Boss黄总吧,面试的第一天我就对黄总建立了一些初步印象。因为我工作经历的关系,我更注重一位老板或者说一位领袖对公司和个人发展过程中产生的影响,我认为这可以是一个公司长期存在发展长远的一个根本因素。当时第一印象我感觉这个人比较豁达不像那种奸诈小人(正直),第二点就是能感受到真诚,这是一个创业者所散发的宝贵品质,第三点就是和蔼,这是疏通员工和老板直接沟通桥梁的关键。人的第一次见面基本上都是建立在自己的假设上面,然后通过日后的进一步接触验证和发现新的认知,庆幸的是Boss的这三点印象从来没从我对他的印象中抹去,这也是我至今留下并且想继续和迪尔西小伙伴一起奋力向前的基础。

再来说说公司的同事们,我自认为自己是一个性格比较直的人,而且作为技术人我也喜欢这种人,因为我认为性格直坦诚是一种宝贵品质,是一个人是否正直的直接体现,而且可以减少不必要的拐弯抹角,这是公司文化里面不可或缺的一部分。当然,任何事情都应该辩证的看待,这个也不例外,我更欣赏它好的一面。其次我喜欢和思维缜密、逻辑性强的人一起共事,然而对我的印象是公司很缺少这样的人才,而且根据我的观察发现公司对招聘人才这块没有得到足够的重视,如果将一个科技公司做个比喻的话,我认为这些基本物质财产(上层建筑)是一个公司的硬件,而软件就是这个科技公司的人才。无疑一个公司要有大的发展,不是表面上的一些东西就能提高的(例如做了多少个项目),有很多例子一再给我们证明,一些特别人物的加入会给公司带来一些核心的变化,这种变化才是真正的发展。其实招聘人才是一个很重要的任务,这也是为什么很多公司有专人在常年筛选优秀人才。面试是招聘人才的一个重要环境,首先我认为作为一个面试者至少要具备几个认知和一个能力:

阅读更多

Android 日志记录轻量级框架 Timber

前言

Log 日志在 Android 项目开发中的作用非常重要,但项目越做越大,开发者会面临很多问题,比如管理各种不同的 Log,不同版本控制是否输入 Log 等。Timber 是一个轻量级的第三方库,能够帮助开发者更好的使用 Android Log。

面临问题

  1. 项目使用 Log 规范不统一,例如:关于 okhttp 的实现使用了 Logging Interceptor 输出 log,关于 rxjava 的实现使用了 onError,其他使用了 Android Log 机制。
  2. 项目开发时,为了方便调试,需要输出 Log,但发布后,Log 中包含很多项目相关的信息,如果全部暴露会有安全隐患,但完全删除也不利于发生问题后的查看调试,因此需要一个开关,关闭开关则不能输出 log,打开开关则可以输出 log。

Timber 介绍

Timeber 的使用主要通过添加 Tree 实例,添加 Tree 实例可以通过方法 Timber.plant 完成。实例化 Tree 需要尽量早,推荐在项目 ApplicationonCreate() 方法中完成。其中,DebugTree 自动实例化,是 Timber 中已经实现了 tree 的类,可直接拿来用,并在使用他的类中以类名为其 TAG,但是其他的 Tree 不会自动实例化,需要进行手动实现扩展 Timber.Tree 实现。

阅读更多

一款让你爱不释手的 Fragment 管理框架

前言

最近在项目中用到了一个 Fragment 管理框架,简直是一个牛逼,这个介绍给大家,这款框架让你爱上使用 Fragment,可以让你的 Fragment 像使用 Activity 一样方便管理。使用它绝对可以让你的开发效率大幅度提升,如果再结合 ConstraintLayout 来开发界面的过程简直让你爽的不要不要的。

项目地址:https://github.com/YoKeyword/Fragmentation

演示APK下载:https://www.pgyer.com/fragmentation

特性

  1. 悬浮球/摇一摇实时查看 Fragment 的栈视图,降低开发难度。
  2. 内部队列机制 解决 Fragment 多点触控、事务高频次提交异常等问题。
  3. 增加启动模式、startForResult 等类 Activity 方法。
  4. 类 Android 事件分发机制的 Fragment BACK 键机制:onBackPressedSupport().
  5. 提供 onSupportVisible()、懒加载 onLazyInitView() 等生命周期方法,简化嵌套 Fragment 的开发过程。
  6. 提供 Fragment 转场动画 系列解决方案,动态改变动画。
  7. 提供 Activity 作用域的 EventBus 辅助类,Fragment 通信更简单、独立(需要使用 EventBusActivityScope 库)。
  8. 支持 SwipeBack 滑动边缘退出(需要使用 Fragmentation_SwipeBack 库)。

阅读更多

图解 RxJava2-【3】observeOn

上篇文章分析了 RxJava 中 subscribeOn 方法的实现原理,然而只使用 subscribeOn 发现上下游都是执行在子线程中。在日常开发中往往是将上游耗时任务通过 subscribeOn 指定在子线程中,下游通常是更新 UI 等需要在主线程中进行,使用 observeOn(AndroidSchedulers.mainThread()) 就能实现,那么它是怎么做到的呢?

例子

基于上篇文章的代码,修改上下游联系,添加 observeOn(AndroidSchedulers.mainThread())

source.subscribeOn(Schedulers.newThread())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(observer);
Log.e(TAG, "其他任务执行");

打印如下:

此时主线程中的「其他任务」没有被阻塞,上游的耗时任务在子线程 RxNewThreadScheduler-1 中执行,而下游接收任务在主线程中进行,并且事件传递不保证顺序(多次执行输出可能都不同),这也是多线程执行顺序的不确定性特点,上篇已介绍过。

阅读更多

图解 RxJava2-【2】subscribeOn

在 RxJava 中可以通过 subscribeOn/observeOn 很方便地完成上下游指定线程的切换,日常开发除了一些常用的 Rx 操作符外,这两个方法也是打交道最多的。本篇先分析 subscribeOn 方法。

例子

先回顾上篇文章的流程,饭店(Observable)开张前提要有厨师(ObservableOnSubscribe),接着改名叫沙县小吃(ObservableCreate),饭店接客(Observable.subscribe(observer)),创建服务员(CreateEmitter)把顾客和厨师关联起来,之后厨师每做一道菜都通过服务员端给顾客,整个流程如下:

我们都知道 Andriod 有主线程,在未指定线程切换操作的情况下,上图的流程是跑在主线程中,另外主线程中往往还存在其他任务需要执行,所以结合线程来看应该是这样的。

阅读更多

HandlerThread详解

概述

在日常开发中,我们经常会通过 new Thread(){}.start(); 的方式来开辟一个新的线程。但是如果我们想要多次执行任务的时候,通过这种方式我就会创建多个线程,这样会使我们的程序运行起来越来越慢。通常情况下我会采用 HandlerThread 的方式来开辟一个线程,那么 HandlerThread 是什么呢?今天我们来介绍一下 HandlerThread。

正文

HandlerThread 是 Thread 的一个子类,HandlerThread 自带 Looper 使他可以通过消息队列来重复使用当前线程,节省系统资源开销。这是它的优点也是缺点,每一个任务都将以队列的方式逐个被执行到,一旦队列中有某个任务执行时间过长,那么就会导致后续的任务都会被延迟处理。它的使用也比较简单。

HandlerThread thread = new HandlerThread("MyHandlerThread");
thread.start();

mHandler = new Handler(thread.getLooper());
mHandler.post(new Runnable(){
    //...
});

接下来我们写一个完整的 Demo,然后在分析一下它的实现原理。

阅读更多

Android 中更为精细的屏幕适配方案

系统 dp 适配存在的问题

做 Android 开发的朋友应该都知道,Android 中屏幕的碎片化问题很严重,为此 Google 提供了 dp 这个单位来适配不同的屏幕。

相同大小的两个屏幕可能具有不同的像素数

从上图我们可以看出来,对于不同屏幕分辨率(像素多少)我们不能使用像素 px 作为单位,而应该使用一种和屏幕密度相关的单位 dp 来表示,最后在绘制的时候转换成 px。

px = dp * (dpi / 160)

阅读更多

如何在 Android 中获取 Heap Dumps

Heap Dumps 是诊断内存相关问题(如内存泄漏、垃圾收集问题和 java.lang.OutOfMemoryError )的重要工具。它们也是优化内存使用的重要工具。在本文中,我们提供了一些不同的方法来从 Android 应用程序捕获 Heap Dumps。一旦捕获了 Heap Dumps,就可以使用 HeapHero 和 Android Studio’s Heap Analyzer 等强大工具来分析 Heap Dumps。

Memory Profile

下面是在 Android Studio中从 Memory Profile (内存分析器)捕获 Heap Dumps 的步骤:

第一步:运行 app 并选择你要分析的设备。

第二步:在 Android Studio 中点击 View → Tool Windows → Android Profiler。

第三步:在 Android Profiler 中会有一个内存变化的时间轴,这个内存(MEMORY)时间轴位于处理器(CPU)时间轴之下,网络(NETWORK)时间轴之上。双击进入内存时间轴详情,然后就可以点击下载图标进行生成 Heap Dump, 如下图:

生成 Android 的 Heap Dump

阅读更多

Android 底部导航菜单的使用

Android 底部导航停留在屏幕的底部,在应用程序的顶层视图之间提供导航。这是在向后兼容的设计支持库中引入的。当应用程序有三到五个顶级导航时,应该使用底部导航。本文将介绍底部导航的基础知识,并将其与 Fragment相结合。我们还将学习如何通过通过 HTTP 调用获取 JSON 来加载第一个带有网格数据的片段(使用 RecyclerView)。

底部导航

使用 Bottom Navigationview 组件可以轻松添加底部导航。您必须使用约束关系或相对关系属性,使它出现在屏幕底部。

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">

    <FrameLayout
        android:id="@+id/frame_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior" />

    <android.support.design.widget.BottomNavigationView
        android:id="@+id/navigation"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom"
        android:background="?android:attr/windowBackground"
        app:itemBackground="@color/bgBottomNavigation"
        android:foreground="?attr/selectableItemBackground"
        app:itemIconTint="@android:color/white"
        app:itemTextColor="@android:color/white"
        app:menu="@menu/navigation" />

</android.support.design.widget.CoordinatorLayout>

阅读更多

Android 构建多语言支持的应用程序

Android 是少数流行的移动操作系统之一,拥有超过 190 个国家的数百万用户,并日益增长。所以当你想让你的应用在全球取得成功时,让应用本地化总是一个好主意。在进行本地化时,您应该考虑根据地区或国家使用适当的文本、音频、货币、数字和图形。但本教程只涉及本地化 Resource 支持多种语言。使用参考资料进行本地化说明在本地化应用程序时应该考虑其他事项。在本文中,我们将构建一个支持多语言的应用程序,它支持法语、德语、印地语和日语。

字符串本地化的工作原理

默认情况下,android 将英语作为主要语言,并从 res ⇒ values ⇒ strings.xml 加载字符串资源。当您想要添加对另一种语言的支持时,您需要通过添加连字符和 ISO 语言代码来创建一个 values 文件夹。例如,如果希望添加对法语的支持,应该创建一个名为 values-fr 的 values 文件夹,并在其中保存一个 strings.xml 文件,其中的所有字符串都翻译成法语。

简而言之,本地化工作如下:

  1. 当用户通过设置语言和输入改变设备语言时,android 操作系统会检查应用程序中是否有合适的语言资源(假设用户选择法语)。
  2. 如果应用支持所选的语言,则 android 在项目的 values-(ISO 语言代码)文件夹中查找其字符串资源。(对于法语,它从 values-fr/string.xml 加载字符串值)。
  3. 如果受支持的语言 strings.xml 缺少任何字符串值,则 android 始终会从默认的 strings.xml 文件(即 values/strings.xml)中加载缺少的字符串。

因此,默认的 stings.xml 文件必须包含应用程序使用的所有字符串值,否则应用程序将崩溃或强制关闭错误。

阅读更多

Android 中的 RecyclerView 使用

Android Recyclerview 是 ListView 的升级版,具有性能提升等优点。同时使用 Recyclerview 和 CardView,可以很容易地创建列表和网格。以下是关于 Recyclerview 和其他例子的完整信息。在本教程中,我们将学习如何使用自定义布局呈现简单的 Recyclerview。我们还将学习编写适配器类、添加列表分隔符和行单击侦听器。我们将要设计的 Recyclerview 视图包含显示标题、类型和发行年份的电影列表。

以下是带有必要属性的RecyclerView小部件:

<android.support.v7.widget.RecyclerView
    android:id="@+id/recycler_view"
    android:scrollbars="vertical"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"/>

在开始之前,请确保将您的 Android Studio 更新到最新版本。目前我的 Android Studio 更新到 Android Studio 3.2。

阅读更多