一、 2015-4-8
1. 依赖注入
2. ImageView的属性android:scaleType的作用分析
3. Android Service完全解析,关于服务你所需知道的一切(上)
4. Android Service完全解析,关于服务你所需知道的一切(下)
二、2015-4-14
1. android--多个Ativity值传递FLAG_ACTIVITY_FORWARD_RESULT
2. Acitivity子类AliasActivity简介和使用
4. Android中改变Activity的不同icon:activity-alias
5. 一个app,多个入口图标,activity-alias实现多程序入口并显示指定view完成
6. Custom filtering of intent chooser based on installed Android package name
三、2015-4-17
1. [Android][Android Studio] *.jar 与 *.aar 的生成与*.aar导入项目方法
四、2015-4-22
3. Android内存优化之三:打开MAT中的Bitmap原图
4. Google利器Android Studio从入门到精通
5. 从Fragment被销毁看replace和add的区别
五、2015-4-23
1. Mastering the Android Touch System (不错的演讲)
3. [Android][Android Studio] Gradle项目中添加JNI生成文件(.so文件)
4. Integrating .so files into your APK
sourceSets.main { jni.srcDirs = [] // This prevents the auto generation of Android.mk jniLibs.srcDir 'src/main/libs' // This is not necessary unless you have precompiled libraries(*.so file) in your project. }
5. Android异步消息处理机制完全解析,带你从源码的角度彻底理解
Handler.sendMessage()
Handler.post()
View.post()
Activity.runOnUiThread()
六、2015-4-28
1. 关于红杏的公益代理, Android Studio以及freso的编译
七、2015-4-29
2. Android Studio Tips -- 布局预览 (xmlns:tools)
3. Android Studio Tips -- 提取方法 (Alt+Shift+M)
八、2015-5-4
注意下,我的styleable的name写的是test,所以说这里并不要求一定是自定义View的名字。
declare-styleable的确是可以不写的。
3. Android Notes - Activity生命周期中的onSaveInstanceState
只要某个Activity是做入栈并且非栈顶时(启动跳转其他Activity或者点击Home按钮),此Activity是需要调用onSaveInstanceState的。
如果Activity是做出栈的动作(点击back或者执行finish),是不会调用onSaveInstanceState的。
5. Android Training - 避免程序无响应ANR
你应该通过Process.setThreadPriority()
并传递THREAD_PRIORITY_BACKGROUND
来设置线程的优先级为”background”:
android.os.Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
如果你不通过这个方式来给线程设置一个低的优先级,那么这个线程仍然会使得你的应用显得卡顿,因为这个线程默认与UI线程有着同样的优先级。
6. Android Training - 代码性能优化小技巧
使用增强的For循环
使用包级访问而不是内部类的私有访问
九、2015-5-6
Tar命令参数说明
c:创建归档文件
x:解压归档文件
v:显示命令执行的进度
f:指定归档文件的名字
t:列出归档文件的内容
z:用gzip过滤存档
j:用bzip2过滤存档
r:添加或更新归档文件中的文件或目录
2. Android xml资源文件中@、@android:、@*、?的含义和区别
引用自定义资源文件:android:text=”@string/hello”
引用系统资源文件:
android:drawable=”@android:drawable/dialog_frame” (public资源)
android:drawable="@*android:drawable/btn_list_attachment_delete_normal"(非public资源)
引用主题属性:android:textColor=”?android:textDisabledColor”
十、2015-5-7
内存消耗与图片文件大小无关。
hdpi 的手机加载低 dpi 资源,例如 ldpi,加载到内存前会先按比例拉伸。内存占用确增大为原来的 4 倍!
如果图片资源在 app 中放错 dpi 文件夹,使用体验会大打折扣,或者尽量使用 9patch 图片。
// DENSITY_DEVICE 是设备的 DPI 大小, ResourceDensity 是设备加载的 DPI 文件夹对应的 DPI 大小
Memory Consumption Size = Width * Height * (DENSITY_DEVICE / ResourceDensity)^2 * (Bit depth / 8)
2. Android Service与Activity之间通信的几种方式
通过Binder对象
通过broadcast(广播)的形式
十一、2015-5-9
* LayoutInflater inflater = mActivity.getLayoutInflater(); //调用Activity的getLayoutInflater()
* LayoutInflater localinflater =(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
* LayoutInflater inflater = LayoutInflater.from(context);
* 这三种方式最终本质是都是调用的Context.getSystemService()。
3. Java习惯用法总结
* 不要像这样使用重复的字符串连接:s += item ,因为它的时间效率是O(n^2)。
* 优先使用StringBuilder,因为它更快。
* StringBuffer的所有方法都是同步的,而你通常不需要同步的方法。
十二、2015-5-13
1. Difference between getContext() , getApplicationContext() , getBaseContext()
View.getContext(): Returns the context the view is currently running in. Usually the currently active Activity.
2. Execution failed for task ':imagepipeline:ndk_build_gifimage'.
如果你遇到这个错误,多半是找不到ndk环境导致的
十三、2015-5-15
1. HTTP 304状态分析
对于动态页面,就是动态产生的页面,往往没有包含 Last Modified 信息,这样浏览器、网关等都不会做缓存,也就是在每次请求的时候都完成一个 200 的请求。
对于动态页面做缓存加速,首先要在 Response 的 HTTP Header 中增加 Last Modified 定义,其次根据 Request 中的 If Modified Since 和被请求内容的更新时间来返回 200 或者 304 。
十四、2015-5-18
OnCreate <-> OnAttach - OnCreate - OnCreateView - OnActivityCreated
OnStart <-> OnStart
...
OnDestroy <-> OnDestroyView - OnDestroy - OnDetach
Object[] array = list.toArray();
list = Arrays.asList(array);
set = new HashSet(list);
array = set.toArray();
十五、2015-5-20
Fiddler如何监测VirtualBox中windows系统的网络请求:以VirtualBox为例
- VirtualBox [设置] – [网络] – [网卡1] – 在网络选项卡中将[连接方式]改为 Bridged Adapter[桥接网卡](默认为NAT)
- Fiddler 工具栏 Tools – Fiddler Options – Connections 中勾选 Allow Remote Computers to Connect
- 查看虚拟机的IP地址 [cmd] - [ipconfig],如 192.168.0.7
- 打开Android设置,长按当前wifi连接,设置HTTP代理,将服务器填为上一步中获得的IP,即192.168.0.7,端口填8888
十六、2015-5-25
1. Fiddler 教程
十七、2015-5-27
数字2:在这些类中去layout inflate是合法的,但是会使用系统默认的主题样式,如果你自定义了某些样式可能不会被使用(LayoutInflater.from(mContext.getApplicationContext))。
十八、2015-5-28
2. How to use MVVM pattern in Android (Droidcon Krakow 2014) (PPT演示)
3. Android MVVM框架RoboBinding初探
4. Linux grep命令过滤关键字
如果你是想只显示配置文件中的以 # 号开头的行,那就使用
# grep ^# filename
如果是想显示除 # 号开头的行的话呢,只需加个参数-v (-v 表示相反的过滤)就行了
# grep -v ^# filename
5. armeabi armeabi-v7a mips x86 理解
虽然armeabi通用性强,但速度慢,而v7a能充分发挥v7a CPU的能力。armeabi就是针对普通的或旧的armcpu,armeabi-v7a是针对有浮点运算或高级扩展功能的arm cpu。x86、mips同理。
十九、2015-5-29
1. android图片压缩质量参数Bitmap.Config RGB_565等的含义
2.Exception OutofMemoryError dalvik.system.VMRuntime.newNonMovableArray(Native Method)
Try enabling large heap support, by adding this to your AndroidManifest.xml file:
<application android:largeHeap="true"
Also, you can reduce the memory required for your Bitmaps by using the Bitmap.Config type RGB_565 instead of ARGB_8888.
二十、2015-5-30
1. Activity启动模式图文详解:standard, singleTop, singleTask 以及 singleInstance
2. 细说Java单例模式
- 懒汉方式。指全局的单例实例在第一次被使用时构建。
- 饿汉方式。指全局的单例实例在类装载时构建。
在执行类的初始化期间,JVM会去获取一个锁。
反射的某些地方绕过了java机制的限制,private只在编译时进行权限的限制,但是在运行时是不存在这种权限的限制的 。
使用enum实现的单例自带防序列化与防反射(抽象类)功能。
3. Java 理论与实践: 正确使用 Volatile 变量
Java 语言中的 volatile 变量可以被看作是一种 “程度较轻的 synchronized
”;与 synchronized
块相比,volatile 变量所需的编码较少,并且运行时开销也较少,但是它所能实现的功能也仅是 synchronized
的一部分。
4. 双重检查锁定与延迟初始化 (单例模式)
双重检查锁定看起来似乎很完美,但这是一个错误的优化!在线程执行到第4行代码读取到instance不为null时,instance引用的对象有可能还没有完成初始化(发生重排序)。
[在JDK1.5之后(1.5之前没有volatile关键字),可以使用volatile变量禁止指令重排序,让DCL生效]
基于volatile的双重检查锁定的解决方案(double-check idiom):
private volatile static Instance instance;
基于类初始化的解决方案(lazy initiallization holder class idiom):
public static Instance getInstance() { return InstanceHolder.instance ; //这里将导致InstanceHolder类被初始化 }
对于实例域,使用双重检查模式(double-check idiom):性能考虑,避免域初始化后访问这个域的锁定开销
对于静态域,使用(lazy initiallization holder class idiom):现代的VM将在初始化类的时候,同步域的访问
二十一、2015-6-1
1. failed to find Build Tools revision 21.1.1 - sdk up to date
Get Build Tools revision 21.1.2
sudo android update sdk --no-ui --all --filter build-tools-21.1.2
Help:
sudo android update sdk --help
Get list of available Android SDK updates:
sudo android list sdk --extended --all
2. Android View.OnTouchListener 的子类
- AutoScrollHelper 抽象类,用于控件边缘触发自动滚动。他能完成的功能就是在 View 的边缘长按时能自动地滚动视图 。
- ListViewAutoScrollHelper 用于 ListView,目前 SDK 里的唯一 AutoScrollHelper 实现类。
- ZoomButtonsController 用于控制缩放控件。
二十二、2015-6-2
1. Git 常用命令
2. 公共技术点之面向对象六大原则(以Volley为例)
单一职责原则:单一职责原则并不是说一个类只有一个函数,而是说这个类中的函数所做的工作必须要是高度相关的,也就是高内聚。
里氏替换原则:里氏替换原则就是依赖于继承、多态这两大特性。里氏替换原则简单来说就是所有引用基类的地方必须能透明地使用其子类的对象。
依赖倒置原则:模块间的依赖通过抽象发生,实现类之间不发生直接的依赖关系,其依赖关系是通过接口或抽象类产生的。
开闭原则:对扩展开放,对修改关闭。
接口隔离原则:当一个接口太大时,我们需要将它分割成一些更细小的接口,使用该接口的客户端仅需知道与之相关的方法即可。
迪米特原则:一个对象应该对其他对象有最少的了解。
3. java.lang.IllegalArgumentException: pointerIndex out of range(multiple-touch)
// create an action
int action = (event.getActionMasked() & MotionEvent.ACTION_MASK); // getting pointerindex int pointerIndex = ((event.getAction() & MotionEvent.ACTION_POINTER_INDEX_MASK) >> MotionEvent.ACTION_POINTER_INDEX_SHIFT); //catch invalide if(pointerIndex == MotionEvent.INVALID_POINTER_ID){ return; }
使用event.getX(pointerIndex)而不是event.getX(),以防止多点触控报异常。
Beside, see http://stackoverflow.com/questions/6919292/pointerindex-out-of-range-android-multitouch
calling findPointerIndex(ev, activePointer)
returns -1
if it fails to find. Preventing dispatching touch event with invalid pointer less than 0 and pointer index greater or equal than pointer count for that event will probably prevent validation of pointer inside native MotionEvent implementation from throwing IAE.
int pointerCount = MotionEventCompat.getPointerCount(ev); int index = MotionEventCompat.getActionIndex(ev); int activePointerId = MotionEventCompat.getPointerId(ev, index); int pointerIndex = MotionEventCompat.findPointerIndex(ev,activePointerId);
二十三、2015-6-4
Ctrl+1 到 Ctrl+8 切换到指定位置编号的标签页。
Ctrl+Tab 或 Ctrl+PgDown 切换到下一个标签页
Ctrl+W 或 Ctrl+F4 关闭当前标签页或弹出式窗口
Ctrl+J 查看”下载”页
二十四、2015-6-8
xml: android:button="@null"
java: checkBox.setButtonDrawable(new ColorDrawable(Color.TRANSPARENT));
2. GridView的OnItemClickListener不响应问题
gridview中有节点是xxxbutton,点击事件会被xxxbutton拦截了,所以OnItemClickListener不会被callback。
checkbox控件也会拦截点击事件。
二十五、2015-6-9
Ctrl+Shift+/:模块注释,反注释再按一次即可,注意这边的”/“不能用小键盘的
Ctrl+Shift+小键盘/:折叠代码
Ctrl+[或]可以跳到大括号的开头结尾
Shift+Click可以关闭文件
二十六、2015-6-11
Android 和 Java 内存泄露检测。
二十七、2015-6-13
在Android中,规定以160dpi为基准,1dip=1px,如果密度是320dpi,则1dip=2px,以此类推。
android:layout_weight的真实含义是:如果View设置了该属性并且有效,那么该 View的宽度等于原有宽度(android:layout_width)加上剩余空间的占比。
假如我们的宽度不是0dp(wrap_content和0dp的效果相同),而是match_parent,占比和上面正好相反。
二十八、2015-6-25
1. Linux的五个查找命令
2. Git远程操作详解
3. 推荐几个非常有用的工具
4. java反射机制
5. Java Enum
6. Fragment onOptionsItemSelected not being called
However the activity gets a chance to handle the event first, so the system calls onOptionsItemSelected() on the activity before calling the same callback for the fragment.
7. Android Studio : Failure [INSTALL_FAILED_OLDER_SDK]
I now I solved my problem by changing the AVD (I'm using Genymotion) to API 19.
手机SDK(系统)版本比build.gradle中设置的minSdkVersion低.
8. ANDROID – 基於 ACTIONBARCOMPAT(APPCOMPAT) 的 ACTION BAR STYLE 設定
getSupportActionBar().setBackgroundDrawable(getResources().getDrawable(R.drawable.my_color));
int titleId = Resources.getSystem().getIdentifier("action_bar_title", "id", "android");
TextView titleView = (TextView)findViewById(titleId);
titleView.setTextColor(getResources().getColor(android.R.color.black));
這邊需要透過 Resources.getSystem().getIdentifier("action_bar_title", "id", "android") 來取得 ActionBar Title 的 ID,然後再設定其 TextView 來設定文字顏色,範例中的顏色就直接以系統色碼 – 黑色來取代之,完成結果如下。
9. Failure [INSTALL_FAILED_UPDATE_INCOMPATIBLE]
Usually it's due to having a signed release version on my phone, then trying to deploy the debug version on top.
二十九、2015-6-26
1. ! [remote rejected] master -> refs/for/master (no changes made)
I was trying to push a new change, on top of a change which was still up for review, who's parent also was up for review.
$ git reset --hard HEAD^
$ git cherry-pick (commitId)
$ git push origin master:refs/for/master
三十、2015-7-8
1. Is there a unique Android device ID?
SN序列号:android.os.Build.SERIAL
IMEI:((TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE)).getDeviceId();
2. setCompoundDrawables与setCompoundDrawablesWithIntrinsicBounds的区别
setCompoundDrawablesWithIntrinsicBounds(Drawable left, Drawable top, Drawable right, Drawable bottom)
Sets the Drawables (if any) to appear to the left of, above, to the right of, and below the text. Use null if you do not want a Drawable there. The Drawables' bounds will be set to their intrinsic bounds.
setCompoundDrawables(Drawable left, Drawable top, Drawable right, Drawable bottom)
Sets the Drawables (if any) to appear to the left of, above, to the right of, and below the text. Use null if you do not want a Drawable there. The Drawables must already have had setBounds(Rect)
called.
三十一、2015-7-15
三十二、2015-7-17
三十三、2015-7-21
1. Synchronized和Static Synchronized区别
因为是static synchronized,所以不同实例之间仍然会被限制
A: synchronized static是某个类的范围,synchronized static cSync{}防止多个线程同时访问这个 类中的synchronized static 方法。它可以对类的所有对象实例起作用。
B: synchronized 是某实例的范围,synchronized isSync(){}防止多个线程同时访问这个实例中的synchronized 方法。
2. Java - synchronizing static methods
"Avoid lock on static methods: worst solution is to put the "synchronized" keywords on the static methods, which means it will lock on all instances of this class."
三十四、2015-7-23
save和restore要配对使用(restore可以比save少,但不能多),如果restore调用次数比save多,会引发Error。
2. AnimatorSet: Circular dependencies cannot exist
Don't reuse the AnimatorSet, create a new one and it will be ok. The builder is accumulating the values and therefore creating a loop (the animation depending on itself in the "before")
3. Android属性动画完全解析(上),初识属性动画的基本用法
4. Android属性动画完全解析(中),ValueAnimator和ObjectAnimator的高级用法
5. Android属性动画完全解析(下),Interpolator和ViewPropertyAnimator的用法
6. Android 属性动画(Property Animation) 完全解析 (上)
7. Android 属性动画(Property Animation) 完全解析 (下)
9. 贝塞尔曲线扫盲
三十五、2015-7-25
1. Android利用canvas画各种图形(点、直线、弧、圆、椭圆、文字、矩形、多边形、曲线、圆角矩形)
最高位就是Alpha通道的值,对齐进行改变后再新建一个Bitmap
设置canvas的Paint的透明度,然后通过canvas.drawBitmap()来改变View的透明度
三十六、2015-7-27
1. Android布局优化之ViewStub、include、merge使用与源码分析
在include时设置了id,会复写原布局根元素的id
在中ViewStub设置了inflatedId,会复写原布局根元素的id
2. 详解Eclipse断点
4. Android Studio IDE: Break on Exception
三十七、2015-7-29
1. android:descendantFocusability属性在ListView中的妙用
通常会遇到listview的每一项无法响应点击的问题,因为消息还没传回每一项的viewgroup就被其子view消费了
只需要在每一项Item布局的根布局加上android:descendantFocusability=”blocksDescendants”的属性就好了
三十八、2015-7-31
1. ViewPager -- Fragment 切换卡顿 性能优化
Fragment轻量化,精简Fragment的布局
防止Fragment被销毁
Fragment内容延迟加载
三十九、2015-8-1
1. Android 图片Bitmap的剪切
3. Android图片旋转,缩放,位移,倾斜,对称完整示例(一)——imageView.setImageMatrix(matrix)和Matrix
4. Android图片旋转,缩放,位移,倾斜,对称完整示例(二)——Bitmap.createBitmap()和Matrix
5. Android Immutable bitmap crash error
四十、2015-8-5
自定义系统菜单项
2. android动态显示和隐藏status bar(通知栏)
四十一、2015-8-6
1. Android Studio利用Gradle删除没有使用到的资源和代码文件
android { buildTypes { release { minifyEnabled true shrinkResources true } } }
ViewTreeObserver.OnGlobalLayoutListener, // 用于监听布局之类的变化,比如某个控件消失了
四十二、2015-8-7
1. 微信分享:代码混淆之后,会导致无法弹出发送第三方消息的确认框
能够调起微信到选择好友列表,但是点击发送后无响应,请检查proguard配置是否对微信SDK代码进行了混淆,建议不要对SDK对混淆,参考以下proguard配置:
-keep class com.tencent.mm.sdk.** {
*;
}
四十三、2015-8-8
1. Android Studio's debugger not stopping at breakpoints within library modules
As stated in the comments of this issue, setting minifyEnabled false
in the debug build is the best practice. By setting this variable in the app module you are disabling the entire proguard build process. It is useful when optimizing the release build, but gives some problems if you are testing and developing.
四十四、2015-8-10
1. Android TextView中文字通过SpannableString来设置超链接、颜色、字体等属性
四十四、2015-8-11
1. Java静态内部类、匿名内部类、成员式内部类和局部内部类
内部类可以是静态(static)的,可以使用 public、protected 和 private 访问控制符,而外部类只能使用 public,或者默认。
非静态内部类中不能声明任何 static 成员(变量)。[注意这里说的是变量,常量(也就是final static修饰的属性)还是可以的]
局部类不可以是 static 的,里边也不能定义 static 成员;
局部类不可以用 public、private、protected 修饰,只能使用缺省的;
2. 使用静态内部类提高封装性
静态内部类有两个优点:加强了类的封装性和提高了代码的可读性
提高封装性:静态内部类是外部类的子行为或子属性,两者直接保持着一定的关系
内部类持有一个外部类的引用,可以自由访问。
`静态内部类不持有外部类的引用
`静态内部类不依赖外部类
`普通内部类不能声明static的方法和变量
Happen-Before规则
该消息引用了Activity的Handler对象,然后这个Handler又引用了这个Activity。这些引用对象会保持到该消息被处理完,这样就导致该Activity对象无法被回收,从而导致了上面说的 Activity泄露。
Java中内部类(匿名内部类也一样)会有宿主类的强引用。
6. java内存泄露原因总结
当集合里面的对象属性被修改后,再调用remove()方法时不起作用。
静态集合类引起内存泄露。
单例模式:单例对象在被初始化后将在JVM的整个生命周期中存在(以静态变量的方式)。
使用静态内部类和弱引用。
如果一个对象具有弱引用,那么当GC线程扫描的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。
但由于垃圾回收器是一个优先级很低的线程,因此不一定会很快发现那些只具有弱引用的对象。
9. Android 消息处理机制之二: Message 中 obtain()源代码剖析
获取Message对象的时候是不能用 "new Message" 的方式来获取,而必须使用Message.Obtain()的方式来获取Message对象
四十五、2015-8-17
2. Make Your Background Moving Like on the Play Music App (Playing with ImageView.setImageMatrix)
don’t forget to set the MATRIX
scaleType:
ImageView.setScaleType(ScaleType.MATRIX) / android:scaleType="matrix"
adb logcat ActivityManager:I MyApp:D *:S (输出标记为“ActivityManager”并且优先级大于等于“Info”和标记为“MyApp”并且优先级大于等于“Debug”的日志)
adb logcat -v time (显示时间)
四十六、2015-8-18
1. Centering Textview Below a image button that is under relative layout?(文本与图片居中对齐)
just align its start and end together, the result is the TextView aligned to the center:
android:layout_alignStart="@id/my_image_view"
android:layout_alignEnd="@id/my_image_view"
note: the width of the text will be limited to the width of the icon
四十七、2015-8-19
1. Android编程获取网络连接状态(3G/Wifi)及调用网络配置界面
Context.startActivity(new Intent(Settings.ACTION_WIFI_SETTINGS)); //直接进入手机中的wifi网络设置界面
四十八、2015-8-22
1. How to increase Android Studio memory limit in Mac
Xmx
specifies the maximum memory allocation pool for a Java Virtual Machine (JVM), while Xms
specifies the initial memory allocation pool.
四十九、2015-8-25
1. android listView 到上下边界 蓝色或黄色阴影去除方法
在2.3之前可以在listview的属性中通过设置android:fadingEdge="none"来解决问题,但是在2.3及以上这个是不行的。
这里,可以通过代码来设置模式,禁止其阴影的出现:
if(Integer.parseInt(Build.VERSION.SDK) >= 9){
this.setOverScrollMode(View.OVER_SCROLL_NEVER);
}
五十、2015-8-26
1. Android AlertDialog去掉系统黑色背景
dialog.getWindow().setBackgroundDrawableResource(android.R.color.transparent);
五十一、2015-8-28
1. Android中如果你也使用commons-codec-1.6并且出现了问题
Google Android内部也有一个包名一样的工程,而且类名也相同,关键一点是没有该方法!于是导致包名冲突。
2. url parameters and map the transformation between
Collections.sort(arl,new Realize_Comparator());
五十二、2015-8-30
1. Android动画学习笔记-Android Animation
adb shell setprop log.tag.SQLiteLog V
软键盘的弹出隐藏用OnGlobalLayoutListener监听实现
5. Android App Launching Made Gorgeous(Starting Window)
Simply add the android:windowBackground into default application/activity's theme solve the problem.
五十三、2015-9-15
1. android:scrollbarStyle属性及滚动条和分割线覆盖问题
insideOverlay:默认值,表示在padding区域内并且覆盖在view上
insideInset:表示在padding区域内并且插入在view后面
outsideOverlay:表示在padding区域外并且覆盖在view上,推荐这个
outsideInset:表示在padding区域外并且插入在view后面
列限制:80或100
不要使用组合声明,比如int a, b;
需要时才声明,并尽快进行初始化
中括号是类型的一部分:String[] args
, 而非String args[]
。
在一个switch块内,通过一条注释来说明程序将继续执行到下一个语句组(// fall through)
每个switch语句都包含一个default
语句组,即使它什么代码也不包含。
类和成员的modifiers如果存在,则按Java语言规范中推荐的顺序出现:(public abstract static final synchronized)
public protected private abstract static final transient volatile synchronized native strictfp
包名全部小写,连续的单词只是简单地连接起来,不使用下划线。
每个常量都是一个静态final字段,但不是所有静态final字段都是常量。
Tip:不要使用finalize。如果你非要使用它,请先仔细阅读和理解Effective Java 第7条款:“Avoid Finalizers”,然后不要使用它。
五十四、2015-9-16
1. MAT - Memory Analyzer Tool 使用进阶
五十五、2015-9-24
Note: 当系统开始清除LRU缓存中的进程时,尽管它首先按照LRU的顺序来操作,但是它同样会考虑进程的内存使用量。因此消耗越少的进程则越容易被留下来。
五十六、2015-10-10
1. 使用setDrawingCacheEnabled(boolean flag)提高绘图速度
void setDrawingCacheEnabled(boolean flag),
Bitmap getDrawingCache(boolean autoScale),
void buildDrawingCache(boolean autoScale),
void destroyDrawingCache()
五十七、2015-10-21
float a = 123.2334f;
float b = (float) (Math.round(a * 100)) / 100; // (这里的100就是2位小数点,如果要其它位,如4位,这里两个100改成10000)
Math.round()方法表示“四舍五入” ,算法为Math.floor(x+0.5),即将原来的数字加上0.5后再向下取整
3. How to generate an MD5 checksum for a file in Android?
五十八、2015-10-24
git rebase -i HEAD~3
Android 3.0开始对AsyncTask的API做出了一些调整:#execute()提交的任务,按先后顺序每次只运行一个
如果你真想并行执行任务,你可以使用另外一个版本:使用THREAD_POOL_EXECUTOR参数的executeOnExecutor方法
AsyncTask.executeOnExecutor(Executors.newSingleThreadExecutor());
AsyncTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR)你也可以采用这个系统提供的线程池来处理你的任务
系统默认的线程池可以需要等待,它默认是按顺序执行(THREAD_POOL_EXECUTOR)或者最多执行5个(SerialExecutor)
使用自定义的线程池,这样就可以即使的执行你的任务需求:new AsyncTask.executeOnExecutor((ExecutorService)Executors.newCachedThreadPool())
5. Android的线程池:ExecutorService和Executors简单介绍
6. Pressed状态和clickable, duplicateParentState的关系
当设置setDuplicateParentStateEnabled为true时,View的DrawableState直接使用了其parent的。所以,他的drawable状态会一直保持与其parent同步。
五十九、2015-10-26
1. Java中的ReentrantLock和synchronized两种锁定机制的对比
我们什么时候才应该使用 ReentrantLock
呢?答案非常简单 —— 在确实需要一些 synchronized 所没有的特性的时候,比如时间锁等候、可中断锁等候、无块结构锁、多个条件变量或者锁投票。
六十、2015-10-27
一个在 Java VM 上使用可观测的序列来组成异步的、基于事件的程序的库
2. Android之取消ViewPager+Fragment的预加载(懒加载)
setUserVisibleHint每次fragment(左右切换)显示与隐藏都会调用,他的调用顺序优于onCreate,需要进行一些状态的判断。
六十一、2015-10-28
1. 当有多个设备online时,命令行窗口通过adb连接指定设备方法
$ adb devices
$ adb -s <serial number> cmd
$ adb -s SH0A6PL00243 logcat
六十二、2015-11-13
1. RecyclerView android:layout_width="match_parent"无效
View view = mInflater.from(mContext).inflate(R.layout.item_fra_main2, parent,
false
);
//View view = View.inflate(parent.getContext(), R.layout.item_fra_main2, null);// match_parent无效
六十三、2015-11-16
如果一个保留字符在特定上下文中具有特殊含义(称作"reserved purpose") , 且URI中必须使用该字符用于其它目的, 那么该字符必须百分号编码. 百分号编码一个保留字符。
例如,"/
", 如果用作URI的路径成分的分界符, 则是具有特殊含义的保留字符. 如果该字符需要出现在URI一个路径成分的内部, 则三字符序列"%2F
"或"%2f
"就用于代替原本的"/
"出现在该URI路径成分的内部.
2005年1月发布的RFC 3986,强制所有新的URI必须对未保留字符不加以百分号编码;
其它字符要先转换为UTF-8字节序列, 然后对其字节值使用百分号编码。
2. Android RecyclerView 使用完全解析 体验艺术般的控件
六十四、2015-11-26
1. Android中Activity四种启动模式和taskAffinity属性详解
任务(Task)不仅可以跨应用(Application),还可以跨进程(Process)[由android:taskAffinity决定所在任务栈(Task)]
在启动一个singleTask的Activity实例时,如果系统中已经存在这样一个实例,就会将这个实例调度到任务栈的栈顶,并清除它当前所在任务中位于它上面的所有的activity。
singleInstance总是在新的任务中开启,并且这个新的任务中有且只有这一个实例,也就是说被该实例启动的其他activity会自动运行于另一个任务栈中。
Add throttling behaviour: debounce() is what you usually need.
Kill the previous requests: introduce switchMap instead of flatMap.
No error functionality / no network functionality: You need a retry mechanism for these.
RxTextView.textChanges(searchEditText) .debounce(150, MILLISECONDS) // throttling behaviour .switchMap(Api::searchItems) // Kill the previous requests .retryWhen(new RetryWithConnectivityIncremental(context, 5, 15, SECONDS)) // a retry mechanism .subscribe(this::updateList, t->showErrorToUser());
3. Observe on the correct thread
- The .subscribeOn() changes the Scheduler where the Observable should operate.
- The .observeOn() changes the Scheduler where the Observable will send notifications.
- Additionally you need to know that by default, the chain of operators will work on the same thread on which its .subscribe() method is called.
Instead of doing this: Observable.just(1,2,3).subscribeOn(Schedulers.newThread()).observeOn(AndroidSchedulers.mainThread()).flatMap(/** logic which doesn't touch ui **//).subscribe();
do this: Observable.just(1,2,3).subscribeOn(Schedulers.newThread()).flatMap(/** logic which doesn't touch ui **//).observeOn(AndroidSchedulers.mainThread()).subscribe();
Earlier .subscribeOn() wins.
六十五、2015-11-27
AsyncSubject:仅释放Observable释放的最后一个数据,并且仅在Observable完成之后(subject.onComplete())。
observer will receive no onNext events if the subject.onCompleted() isn't called.
当Observer订阅了一个BehaviorSubject,它一开始就会释放Observable最近释放的一个数据对象,当还没有任何数据释放时,它则是一个默认值。
PublishSubject:仅会向Observer释放在订阅之后Observable释放的数据。
不管Observer何时订阅ReplaySubject,ReplaySubject会向所有Observer释放Observable释放过的数据。
假设你有一个Subject,你想把它传递给其它的代理或者暴露它的Subscriber接口,你可以调用它的asObservable方法,这个方法返回一个Observable。具体使用方法可以参考Javadoc文档。
如果你把 Subject
当作一个 Subscriber
使用,注意不要从多个线程中调用它的onNext方法(包括其它的on系列方法),这可能导致同时(非顺序)调用,这会违反Observable协议,给Subject的结果增加了不确定性。
要避免此类问题,你可以将 Subject
转换为一个 SerializedSubject
,类似于这样:
mySafeSubject = new SerializedSubject( myUnsafeSubject );
六十六、2015-12-10
事件总线机制:A不需要调用B类的方法,而仅仅需要产生并发出 一个“事件通知”, 如果B订阅了该“事件” 那么它将会接受到这个事件,做出相应的操作。这样就被解耦了。
六十七、2015-12-12
某些布局属性要加在ViewStub而不是实际的布局上面,才会起作用,比如上面用的android:layout_margin*系列属性,如果加在TextView上面,则不会起作用,需要放在它的ViewStub上面才会起作用。而ViewStub的属性在inflate()后会都传给相应的布局。
六十八、2015-12-12
1. Android多个Activity切换时其生命周期中的方法执行顺序
A.onPause() -> B.onCreate()/onRestart() -> B.onStart() -> B.onResume -> A.onStop()
六十九、2015-12-13
MVC:View里会包含Model信息,不可避免的还要包括一些业务逻辑。更改View也是比较困难的,至少那些业务逻辑是无法重用的。
MVP:通过定义好的接口进行交互,从而使得在变更View时候可以保持Presenter的不变(重用)。我们可以将一个Presenter用于多个视图,而不需要改变Presenter的逻辑。
还可以编写测试用的View,模拟用户的各种操作,从而实现对Presenter的测试而不需要使用自动化的测试工具。可以脱离用户接口来测试这些逻辑(单元)。
Activity可以把所有逻辑给Presenter处理,这样Java逻辑就从手机的Activity中分离出来!
View只应该有简单的Set/Get的方法,用户输入和设置界面显示的内容,除此就不应该有更多的内容,绝不容许直接访问Model。
“Model”,指的是检索或控制一个model的业务逻辑层。
理论上来说presenter和业务逻辑层都是纯旧式的能够与桌面应用或其他任何java应用共享的java代码。(不被绑定到Android平台上)。
定义一个专门的接口可以提高代码可读性,并且将来可以灵活地定义更多其他的与View相关的方法。
Fragment提交事务异步的,而且是附加在主线程Handler队列尾部的。
七十、2015-12-17
1. Android应用启动优化:一种DelayLoad的实现和原理
Activity 的 onCreate/onStart/onResume三个回调中,并没有执行Measure和Layout操作, 这个是在后面的performTraversals中才执行的.
getWindow().getDecorView().post(new Runnable()); // 第二个 performTraversals 方法执行完成后马上就执行Runnable了
2. 给 App 提速:Android 性能优化总结(-)
七十一、2015-12-20
1. 有什么好用的Android Studio的插件值得推荐?(-)
2. 凯子哥带你学framework-Activity界面显示全解析(-)
七十二、2015-12-25
1. ubuntu安装 JDK 及 android studio,adb 命令配置
2. Android Performance Case Study(-)
4. Android应用架构(!)
七十三、2015-12-28
1. Android Recyclerview GridLayoutManager column spacing
七十四、2015-12-29
1. ScrollView里面嵌套ListView,RecyclerView
直接嵌套会有总是问题,需要重写onMeasure()方法。
七十五、2015-12-30
1. Retrofit — Using the Log Level to Debug Requests(Retrofit 1)
RestAdapter.Builder builder = new RestAdapter.Builder() .setEndpoint(API_LOCATION) .setLogLevel(RestAdapter.LogLevel.FULL) // this is the important line .setClient(new OkClient(new OkHttpClient()));
2. RxJava变换操作符:.concatMap( )与.flatMap( )的比较
flatMap()使用merge()操作符,而concatMap()使用concat()。
flatMap()可能交错的发送事件,最终结果的顺序可能并是不原始Observable发送时的顺序。
concatMap()遵循元素的顺序。
3. Capturing executor for current thread
七十六、2016-1-6
1. Android开发中的MVP架构(!)
七十七、2016-1-8
1. Android 属性 allowBackup 安全风险浅析
Android API Level 8 及其以上 Android 系统提供了为应用程序数据的备份和恢复功能。
此功能的开关决定于该应用程序中AndroidManifest.xml
文件中的 allowBackup 属性值,其属性值默认是 True。
为了安全起见,开发者务必将 android:allowBackup 标志值设置为 false 来关闭应用程序的备份和恢复功能,以免造成信息泄露和财产损失。