自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

夜行小生

夜漫漫其仿佛兮,吾將摸索而前行;小浪漫而務實兮,誓與黴靡不同日月生

  • 博客(48)
  • 资源 (4)
  • 收藏
  • 关注

原创 Android 中基于宽度的屏幕适配方案

目录1 一些基本概念2 传统标准适配难题3 基于宽度的屏幕适配原则1 一些基本概念ppi:pixels per inch,即物理设备每英寸的像素数。计算公式为:ppi = sqrt(width² + height²) / 屏幕尺寸(inch)为什么一定要计算出屏幕斜线的像素数呢?因为手机的屏幕尺寸指的就是手机屏幕斜线的长度(单位:英寸)。所以,理论上来说,如果知道屏幕宽度的尺寸,也可以直接通过 ppi = width / 宽度尺寸(inch) 计算出来。dpi:dot pe

2021-08-10 21:49:09 452 5

原创 用 rem 实现移动设备页面元素适配

目录1 什么是 rem2 rem 适配算法3 适配举例4 实际开发1 什么是 remrem (font size of the root element) 表示的是根元素的字体大小,如下:html { font-size: 16px;}根元素字体大小为 16px,那么 1rem = 16px。2 rem 适配算法rem 作为一个长度单位,除了可以作为字体大小来设置,还可以设置 html 的任何元素的尺寸。一般来说,移动设备大小不一,同一个页面元素要在不同的设备上进

2021-08-09 21:30:11 227

原创 Android mvvm 之 databinding 原理

本文为原创内容,转载请注明出处——小舍目录1 Data Binding 的结构1.1 rebind 行为1.2 observe data 行为1.3 observe view 行为2 样例分析——谷歌 sunflower 的改造2.1 Data——FakeData2.2 View——fragment_plant_detail.xml2.3 ViewDataBinding——FragmentPlantDetailBinding2.4 adapter 绑定说明3 免 find

2021-07-29 14:40:02 527

原创 Android mvvm 之 LiveData 的原理

目录1. 生命周期感知1.1 生命周期感知组件1.2 LifecycleOwner 的状态和事件模型2. LiveData 与 LifecycleOwner 的双向订阅2.1 LiveData 订阅生命周期变化2.2 LifecycleOwner 订阅数据变化2.3 多对多的双向订阅网3 LiveData 的事件变化4 LifecycleOwner 的事件变化4.1 Lifecycle 接口的实现——LifecycleRegistry4.1.1 LifecycleRe

2021-07-19 18:44:25 578 8

原创 Android mvvm框架之ViewModel篇

目录1 什么是 ViewModel1.1 先考虑两个场景1.2 缺点1.3 特别说明1.4 ViewModel 解决的问题2 ViewModel 实现原理2.1 ViewModel 类2.2 ViewModel 的构造过程3 ViewModel 与配置无关的原理(与宿主 Controller 俱生俱灭)3.1 ViewModelStore 树3.2 系统级的配置无关支持4 FragmentActivity 中的 ViewModel 生命周期5 多 Control

2021-07-12 21:40:58 872 6

原创 Handler, Message, MessageQueue, Looper —— 吸血鬼和狼人之战的情报网络

1. 吸血鬼和狼人之战在讨论 Handler 机制之前,我们先来讲一个故事:吸血鬼和狼人打仗,战争进入僵持阶段,吸血鬼兵团为了打探狼人军团的动静,决定派遣一名密探潜入狼人军团内部刺探军情,同时命令一名吸血鬼听风者守候在家门口等待吸血鬼密探发来的情报。吸血鬼密探带着专门传递情报的吸血鬼通讯员潜入了狼人军团的内部。吸血鬼密探很快和狼人军团内部打成一片,并且获得了很多

2014-03-26 15:00:02 1372

原创 关于在 Service 或 BroadcastReceiver 中 startActivity 的问题

1. 不从后台启动 Activity 准则:在谷歌的 Android API Guides 中,特意提醒开发者不要在后台启动 activity,包括在 Service 和 BroadcastReceiver 中,这样的设计是为了避免在用户毫不知情的情况下突然中断用户正在进行的工作,在  http://developer.android.com/guide/practices/seaml

2014-01-13 17:42:17 10957 1

原创 浅探 Notification sound 的焦点管理

1. 通知播报流程分析:Android 中用 NotificationManager 处理通知事务,在构建 Notification 时,一般会传入一个音频地址给其中的 sound 字段进行播报,而播报的处理是通过启动 com.android.server.NotificationManagerService 这个服务来完成的,NotificationManagerService 排队

2014-01-13 17:00:53 1976

原创 何时使用 String, StringBuffer, StringBuilder

性能分析:在进行字符串串联操作时(串联的不光是字符串类型)我们有三种选择:采用 String 的 '+' 操作符;采用 StringBuffer.append() 方法;采用 StringBuilder.append() 方法;实际上 2 和 3 差不多,只不过 StringBuilder 不是线程安全的,在讨论本文问题时可以只讨论其一,我们以 StringBuffer

2014-01-03 10:19:03 1568

原创 git 解决冲突问题

提交代码后,如果出现冲突,将无法 rebase,将冲突的文件修改之后,接下来进入如下几步:git add XXX(冲突的文件)git rebase --continue按正常程序提交代码

2013-12-27 15:10:03 783

原创 自定义 Preference Header 布局

1. Preference Header 概述:对于什么是 Preference Header,以及何时使用 Preference Header,请参考我的另一篇博文:何时使用 Preference Headers2. 自定义 Preference Header 布局的必要性:Preference Header 的设计初衷是作为复杂设置选项的一个简单抽象或者概括,所

2013-07-26 11:41:41 3656 2

原创 Wheel ProgressBar 实现之三——模拟进度过程

1. 效果展示:知道如何画圆弧,如何精确画出进度文本之后,我们将进入 Wheel ProgressBar 实现的最后一个过程:模拟其动态呈现过程。如下图所示,初始时显示进度为 0 (左图),点击进度条后,将自动减速加载(右图),每次点击之后都将重新从 0 加载到 100。 2. 实现原理:通过以下几个步骤来实现进度的动态加载:1、画一个灰

2013-07-25 15:10:58 1717 1

原创 Wheel ProgressBar 实现之二——画进度文本

1. 效果展示:我们在 “Wheel ProgressBar 实现之一——画一条弧” 中阐述了如何在一个矩形区域内精确画弧。本节我们实现以圆环中心(即矩形区域中心)为对称点画进度文本,如下图的效果所示:2. 实现原理:在 android 中画字符是通过 Canvas.drawText(String text, float x, float y,

2013-07-19 16:56:34 1162

原创 Wheel ProgressBar 实现之一——画一条弧

1. 实现原理:Wheel ProgressBar(滚动式进度条),在原生的 android 进度条中只有 indeterminate 式的滚动进度条,现在我们来实现一个 determinate 式进度条,就是可以显示具体进度的滚动式进度条,实现的效果形如下图所示:我们分三个步骤来讲解:1、如何准确画一条弧;2、如何准确画出进度文本;3、

2013-07-09 15:25:56 2232

原创 不要通过终止进程的方式清理内存

通过终止进程来清理内存的方案是不合适的,理由如下:1、 android 有自身的进程和内存管理机制,其设计规范是要保证程序尽可能快地启动,这就要求程序退出后仍然占用内存保存数据;2、 android 的内存管理策略保证在新程序载入时有足够的内存,当内存不足时会自行关闭优先级低的进程来释放内存;3、 进程数据长期缓存在内存,对于 android 来说不是缺陷,而是优势,它尽可

2013-07-05 14:34:41 2244

原创 关于 java 中负数四舍五入的问题——Math.round()

在 java 中负数的四舍五入跟我们平常遇到的情况稍有不同,比如:-9.5,通常四舍五入后应该是  -10,而 java 中通过  java.lang.Math.round(-9.5)  运算后的结果是 -9,为什么呢?其实很简单,这个是 java 对 round 方法的定义导致的,看下 round() 方法的源代码就知道了,看起来这个方法有点偷懒:/** * Returns

2013-05-21 16:31:19 8319 2

原创 在列表中控制 AsyncTask 加载 bitmap 的时机

//滑动控制 private OnScrollListener mScrollListener=new OnScrollListener(){ @Override public void onScrollStateChanged(AbsListView view,int scrollState){ if(scrollState==OnScrollListener.SCROLL_ST

2013-04-29 18:41:26 1129 2

转载 LruCache 结合 FIFO 策略实现bitmap缓存

private final int hardCachedSize = 2*1024*1024; private final LruCache sHardBitmapCache = new LruCache(hardCachedSize){ @Override public int sizeOf(String key, Bitmap value){ r

2013-04-29 18:36:19 1462

转载 Multithreading For Performance

转载自:http://android-developers.blogspot.com/2010/07/multithreading-for-performance.htmlA good practice in creating responsive applications is to make sure your main UI thread does the minimum

2013-04-29 18:30:42 1016

翻译 如何避免 ANR

ANR(Application Not Responding)错误在以下两种情况下发生: l 界面在5秒内没有响应用户的输入事件;l BroadcastReceiver 在10秒内没有完成所负责的工作。 相关建议: 1.   在 UI 线程中做尽可能少的工作; 2.   在 Activity 的 onCreate 和 onResume 中做尽可能少的工作;

2013-04-29 18:25:35 878

翻译 使用多线程处理耗时工作

大家对多线程处理耗时工作的重要性应该早已认识到。本章的关键点是:把耗时的、与UI渲染无关的操作进行分割分配到多个线程中并发执行。        在本章,googler 全篇介绍了通过 java 线程池来构造多线程执行环境的详细流程,关键要点如下: 1.   定义一个能在 Thread 中执行的 Runnable 子类 SubRunnable,把耗时的工作交给 SubRunnable

2013-04-29 18:24:13 2461

翻译 应用应该尽可能省电——可持续发展的重要性

智能手机的续航能力一直是一个令用户头疼的问题。作为 android APP 的开发者,我们无法去纠正操作系统本身的设计缺陷,但是应尽可能让我们的 APP 本身不要做太多的无用功来浪费宝贵的电能。 1 监测电量和充电状态       如果你的 APP 在后台需要进行事务更新,那么更新的频率必须是一个值得慎重思考的问题,如果持续更新而不加限制,那无疑会加速电量消耗,而且也是不必要的。当你需

2013-04-29 18:20:20 876

翻译 在后台线程中执行数据库查询

不可否认,从外存中读取数据相对直接从内存读取是耗时的,尤其是批量从数据库中加载数据时,如果直接在 UI 线程中完成,轻则导致界面延迟加载,严重时可导致 ANR。本章又一次重申了在后台线程中执行耗时工作的重要性。        在这里,大家只要认识到:从数据库中进行批量查询应该总是放在后台线程执行。 异步查询机制有 CursorLoader 和 AsyncQueryHadler,本章

2013-04-29 18:16:05 1400

翻译 使用后台服务 IntentService

Service 和 Activity 属于同一级别的应用组件,默认情况下它运行在宿主进程的主线程中,因此,不要因为 Service 没有运行在前台,就误以为它可以毫无条件地执行耗时工作(CPU intensive work),否则将导致 ANR。        而 IntentService 却是个例外,它开辟了一个后台工作线程来执行耗时工作,你可以将离线的耗时工作委托给 IntentSe

2013-04-29 18:14:53 836

翻译 高效使用 Layout

1 优化 Layout 层次看了前面很多高效开发 android 的方法,你恐怕很难注意到,滥用 layout 的后果有多严重。在你的应用中加入的任何一个 widget 和 layout 都需要进行初始化、布局和渲染。比如,嵌套的 LinearLayout 会导致过度的 View 分层,而使用了layout_weight 的嵌套LinearLayout 将导致其所有子元素被重复测量两次。

2013-04-29 18:13:25 845

翻译 性能小诀窍——波斯沃斯决战的小失误,大毁灭

从本篇开始一直到 “ 如何避免 ANR”, 我们介绍 AndroidDeveloper Practices for Performance,我尽量用最精简易懂的方式将这些精要原则呈现给大家,详细的说明还请参考原文档: http://developer.android.com/training/best-performance.html 先讲个故事轻松一下: 公元15世纪英国

2013-04-29 18:08:19 1165

原创 节省你的内存

我刚开始接触手机开发的时候,一昧地认为让程序跑的越快就越好,完全忽略内存是否够不够用,而事实上,手机的CPU速度总是比我们想象的要快,而内存的容量总是比我们想象的要少。忽略内存的使用情况有时候好比一条贪吃的蟒蛇,企图一次吞下大象;有时候好比消化系统出现了问题,只进不出,俗称“BM”。 在 android 开发中这两种情况都有可能发生,当我们批量加载图片时,有可能因为同时写入内存的字节过多,

2013-04-29 17:49:03 1883

原创 该用MVC/MVP吗——房子不需要盖成一样

业内的很多 android 大牛们为了这个问题没少念念碎,对于 android 中使用了何种架构,一种很流行的说法是使用了 MVC ,具体来说: Model:你的业务逻辑,这个基本没什么争议;View:lyout and resources xmls、以及程序中定义的各种View的子类;Controller:activities 此法一出立即引来众多骨灰级大牛的吐槽!很多人

2013-04-29 17:14:44 1535 2

原创 新建你的packages——学会切蛋糕

朋友过生日请你帮TA分蛋糕,在座的有年轻人、小孩、老人、男人、女人,你会怎么分?有以下几个选择: 1.    不要分了,把整个蛋糕分给大家;2.    平均分配,每人吃一样多;3.    按照各类人群的食量和爱好合理分配。显然,第三种方法最佳! 我们在开发一款APP之前需要建立好你的packages,如果整个程序开发下来只有一个package,同时开发的模块和功能又多,

2013-04-29 17:11:57 1093

原创 JSON 简介

1. JSON 结构图有过 android 互联网开发经验的同学对 JSON  一定不会陌生。在下载网络数据时我们经常需要首先获取下载数据的结构,而JSON往往成为此种结构的首选方式,此外还有 XML 的方式,这个以后再介绍,下图是一个 JSON object 的树状结构图:2. 相关说明一个 JSON object 由一

2013-04-21 16:24:12 984

原创 Java URI 和 android Uri 中的 getSchemeSpecificPart() 方法

1. 标准 URI 的语法组成标准的 URI 语法组成如下:[scheme:]scheme-specific-part[#fragment]各部分说明请参考:http://www.cjsdn.net/doc/jdk50/java/net/URI.htmlgetSchemeSpecificPart() 方法即返回中间的 scheme-specific-part 必选部分。

2013-03-14 18:18:55 4813

原创 中文乱码解决及中文编码成UTF8

1. 中文乱码Java中有些类对中文的支持可能有问题,例如在最近用 AndroidHttpClient API 解析 web url 时,通过 303 跳转返回的跳转 url 中包含了中文,但是中文部分显示为类似 ”街景总结这样的乱码,导致 url 无法访问,代码如下,其中的 location 文件名部分中包含了中文乱码: final HttpClient clie

2013-03-12 11:17:11 5192

原创 如何监听 android 手机情景模式(有声、静音、振动)?

当用户设置情景模式时,系统会广播一个 RING_MODE_CHANGE_ACTION 消息,于是我们可以定义一个广播接收器,监听此消息,然后通过 AudioManager 提供的接口判断当前的情景模式做出特定的处理。2. 关键代码private BroadcastReceiver mReceiver = new BroadcastReceiver() { @Overrid

2013-03-08 17:33:51 4886

原创 eclipse中导入android工程时因源工程java编译环境不同导致编译错误的解决方法

1. 问题描述最近我将一个开源项目的工程导入 eclipse 中时发现编译错误如下:The method run() of type XXX must override a superclass method... 可是仔细查看发现 XXX 这个类只是实现了一个普通的 Runnable 接口,然而在其实现方法 run() 处却报出这样的编译错误实属奇怪,因为系统中 java 的安装和环境配置都

2013-03-03 20:38:17 940

原创 PreferenceActivity 中的 onBuildHeaders() 调用时机

1. onBuildHeaders(List)在前一篇博文中(何时使用 Preference Headers)我们讲述了 Preference Headers 的作用和使用场景,onBuildHeaders 这个方法是在 PreferenceActivity 中用于创建和初始化 headers 的,创建 headers 之后我们可以在程序中引用 headers 实例,但需要注意其创建的时机

2013-02-26 10:47:39 3611

原创 何时使用 Preference Headers

1. 问题提出:如何处理需要分屏分组的设置项?在谷歌开发文档中以Android 3.0版本作为基线,对此问题进行不同的处理:Android 3.0之前:采用PreferenceScreen嵌套的方法;Android 3.0及之后:采用Preference Headers的方法。2. 采用 PreferenceScreen 嵌套采用此方法的preference.x

2013-02-25 16:57:40 12055 9

原创 ANR错误 log 调试方法

什么是ANR?ANR——Application Not Responding,就是应用程序无响应的意思,导致此错误通常是由于android主线程中的一个操作执行时间过长,当超过5秒不能响应用户操作时,便出现此异常。如何调试ANR?(常规log + traces)1. 根据log跟踪 ANR 错误是首先想到的方法,出现ANR错误时,在DDMS中键入 “ANR”

2013-02-19 11:00:59 6657

原创 关于android底层库编译出现“undefined reference to `__android_log_print'”的解决方法

问题描述:很多时候,我们需要在自己的android应用程序中调用到其它语言(C)编写的高效率底层模块,一般通过 System.loadLibrary(libname) 来实现,同时我们还需要调试这个用C写的库,在 .c 源文件中打印 log 信息。方法步骤:1、在源文件中添加如下头文件:#include 2、在 Android.mk 文件中包含相关的库:

2012-12-11 17:22:46 8255

原创 通过RelativeLayout.LayoutParams.addRule()方法在代码中设置RelativeLayout相关属性

1. 原理说明:我们知道,在 RelativeLayout 布局中有很多特殊的属性,通常在载入布局之前,在相关的xml文件中进行静态设置即可。但是,在有些情况下,我们需要动态设置布局的属性,在不同的条件下设置不同的布局排列方式,这时候就需要用到 RelativeLayout.LayoutParams.addRule() 方法,该方法有两种重载方式:addRule(int

2012-11-08 21:56:09 22122

原创 我答知乎:网页的侧边栏应该放在左边还是右边?

问题:大多数的网站都把侧边栏放在了左边,也有部分网站把侧边栏放在了右边,那么到底哪种更合适呢?如何考虑哪些内容放在什么位置?我答:@Dadastan 提到了左撇子、右撇子的问题,很有意思,不过我认为恰恰应该是:左撇子右边、右撇子左边对于LZ说的侧边栏方位问题,首先,我在这里假设提到的侧边栏是充当导航作用,事实上这也是最主流的侧边栏功能。那么为什么大多数网

2012-11-07 22:11:07 3288

CustomPreferenceHeader

谷歌并没有给 Preference Header 提供方便的自定义接口,或许考虑到这本身不需要做什么自定义。但是有时候我们确实需要做一些简单的自定义。比如,你的 APP 需要统一 UI 风格,需要自定义的字体、颜色、selector样式等,这时当你需要用到 Preference Header 的时候就需要考虑对其布局进行微自定义... ... 详情请参考: http://blog.csdn.net/ixiaobu/article/details/9493633

2013-07-26

WheelProgressBarDemo

Wheel ProgressBar(滚动式进度条),在原生的 android 进度条中只有 indeterminate 式的滚动进度条,现在我们来实现一个 determinate 式进度条,就是可以显示具体进度的滚动式进度条... ... 一个自定义圆环滚动式进度条的实现,详细请参考 http://blog.csdn.net/ixiaobu/article/details/9282129 http://blog.csdn.net/ixiaobu/article/details/9383423 http://blog.csdn.net/ixiaobu/article/details/9469263

2013-07-26

Wheel ProgressBar 实现之一——画一条弧

Wheel ProgressBar(滚动式进度条),在原生的 android 进度条中只有 indeterminate 式的滚动进度条,现在我们来实现一个 determinate 式进度条,就是可以显示具体进度的滚动式进度条。我们分三个步骤来讲解: 1、如何准确画一条弧; 2、如何准确画出进度文本; 3、如何动态模拟进度过程。 ... ...

2013-07-09

利用ViewPager实现可左右滑动的Action Tab

请参考http://blog.csdn.net/ixiaobu/article/details/8154007

2012-11-07

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除