Handler使用不当造成的OOM

问题重现

编写以下代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class OOMHandlerActivity extends Activity {

private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
((EditText) findViewById(R.id.oom_handler_edit_text)).setText("aaaas");
}
};

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_oom_handler);

mHandler.sendEmptyMessageDelayed(1, 1000 * 60); //这里注意,当延迟时间较小时,Profile中Leaks显示为0
}
}

使用Android Studio自带的Profile进行监控,打开OOMHandlerActivity页面,然后返回上一个页面。Dump内存后,会出现以下提示:

Read More

HTTP协议

HTTP 协议的请求报文和响应报文的结构基本相同,主要由三大部分组成:

  • 状态行(status line):描述响应的基本信息,也就是服务器响应的状态;
  • 头部字段集合(header):使用 key-value 形式更详细地说明报文;
  • 消息正文(entity):实际响应的数据,它不一定是纯文本,可以是图片、视频等二进制数据。
Read More

HTTPS

工作流程

  1. Client发起一个HTTPS(比如 https://juejin.im/user )的请求,根据RFC2818的规定,Client知道需要连接Server的443(默认)端口。
  2. Server把事先配置好的公钥证书(public key certificate)返回给客户端。
  3. Client验证公钥证书:比如是否在有效期内,证书的用途是不是匹配Client请求的站点,是不是在CRL吊销列表里面,它的上一级证书是否有效,这是一个递归的过程,
    直到验证到根证书(操作系统内置的Root证书或者Client内置的Root证书)。如果验证通过则继续,不通过则显示警告信息。
Read More

复杂度定义

时间复杂度

一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数f(n),进而分析f(n)随n的变 化情况并确定T(n)的数量级。这里用”O”来表示数量级,
给出算法的时间复杂度。

T(n)=O(f(n));

它表示随着问题规模的n的增大,算法的执行时间的增长率和f(n)的增长率相同,这称作算法的渐进时间复杂度,简称时间复杂度。

Read More