Android 中的内存泄漏

JVM垃圾回收机制 会对没有引用的对象进行回收,而持有引用的对象是不能被回收的。

匿名内部类包含如下特征
1. new 操作符
2. 实现一个接口,或者继承自一个类
3. 有构造函数的调用,接口因为没有构造函数,默认是无参构造函数。
4. 拥有body,就像类定义一样,body内可以声明方法,但是 不能拓展构造函数。

匿名内部内可以直接访问本地类的成员变量。可访问 方法内通过final 修饰的本地变量。
因此常见的泄漏就是匿名内部类存在对act的引用。

  private Object obj=new Object(){
        @Override
        public String toString() {
            return super.toString()+"bbb";
        }
    };
继续阅读“Android 中的内存泄漏”

SQL 语句查询你爸爸的爸爸是谁?

最近遇到一个问题,有一张表是这样的数据结构,存着你家家谱,所以是自关联的表。假如你要查询你爸爸的爸爸那条记录,该怎么查询? 或者需要看祖宗十八代如何展示?

递归是一个很好的解决方法。递归代码如下

WITH RECURSIVE
qry AS (SELECT * FROM Family WHERE nickname ='You'  UNION ALL SELECT bb.* FROM Family bb INNER JOIN qry on bb.id == qry.parent)
SELECT * FROM qry LIMIT 3, 1;

其中offset 3 是要查询的代数 1 就是你父亲,2 就是你爷爷。。。。

输出:

id  nickname parent
0   YYDBB     0

老生常谈之Android 启动模式

关于启动模式网上一堆一堆的文章可以参考,我只是通过自己实践记录一下实验过程

Tip1. adb shell

dumpsys | grep "DUMP OF SERVICE"  //列举当前手机所有支持的dumpsys命令
查看activity 堆栈
dumpsys activity 包名

找到 Running activities (most recent first): 这一行下面的就是task信息

Task

  1. Task 是一个堆栈。里面维护了一系列Activity
  2. 不同应用的Activity 可以包含在一个Task 里边,比如系统发送邮件等等
继续阅读“老生常谈之Android 启动模式”

HashMap的实现原理

接着昨天的问题

-HashMap 用的多吗?
– 嗯挺多的
– 能说说其原理吗?
– HashMap 是一种数据结构,我们可以通过Key 来存储一些value。 利用Key的HashCode 做为内存地址,以便于很快的查找到对应的Value。
– 什么内存地址?
– 就是java虚拟机中的内存啊,不知道是堆还是栈
– 啊???(心里活动:妈勒个蛋,一本正经的胡说八道)好我们不说这个,那你说到HashCode ,请问HashCode 有可能发生碰撞吗?
– 当然会(hashCode 返回的也就是int 行,最多也就是2的32次方个。总是有限的嘛,而我们的对象可以无限制创建,虽然我还没有对象)
– 那HashMap是如何解决这个问题的呢。
– 额,这个几率会很小吧,可能需要我们重写一下key的hashCode,因为Key 也是Object类的子类吧。所以可以重写,额。。。
– 。。。。

承认,没看过HashMap 源码,我的错。我应该直接说没看过的。尴尬。
那今天来具体看一下 。
说点简单的,HashMap 怎么存储我们的 Key Value,从put 方法开始跟踪。

public V put(K key, V value) {
return putVal(hash(key), key, value, false, true);
}

一个hash 函数。(这个有兴趣可以再看看是怎么算的,我写完这个再去看看) 算出了Hash.
继续阅读“HashMap的实现原理”

彻底弄清楚android 面试经典题:Handler 机制

向来觉得电话面试就觉得肯定黄,总有一种局促和不安,今天接到阿里的电话面,当时在家里。问的问题还是那几个老生常谈的问题。 view 的绘制啊, handler 机制啊,hashmap实现原理啊。效率啊,优化啊啥的。

今天可谓是都碰上了(其实还差那个asyntask 啊 http协议啊 多线程同步啊,jvm 啊,启动流程啊巴拉巴拉),这一关不过,下一关就没门啊,其实这个和项目经验或者一个人能不能做成事情并没有太大关系,最高的智商是把事做成,最高的情商是靠谱。

以前工作没那么多闲情看这个,那今天就带着面试的目的来彻底研究一下 面试第一题 Handler机制。

从应用开发这个角度来看,大家可能都知道 不能在子线程中直接new 一个hander。否则会抛出常见的

[code lang=text]
java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
[/code]

然后大家也知道(上面明显提示),在子线程中假如要创建handler 可以先Looper.prepare()然后就可以创建了。

我们写一个常见的用handler 进行线程间通讯例子,子线程发送消息给主线程更新UI
继续阅读“彻底弄清楚android 面试经典题:Handler 机制”

基于Flask的微博系统开发

起因

个人认为学习一门技术最好是能够做一些项目,『这儿』是一个基于Flask搭建的轻博客,用户可以发帖关注等基本功能。从开发到基本上能用花了大概三个星期时间,我学习这个是跟随这《Flask Web开发》这本书开始做起来的。全书共205页,薄薄的一本,这本书是去年和公司同事凑单买下来的。一只放在书桌上没看,十一月份正好没有什么其他事情,就像做这个项目练练手。
网址:
http://zheer.me
github:
https://github.com/hsiunien/Phantom
主机:阿里云

继续阅读“基于Flask的微博系统开发”