主要将一些好的博客文章收集起来
讲解okhttp的用法及封装:http://blog.youkuaiyun.com/lmj623565791/article/details/49734867
讲解子线程中不能创建Handler:http://www.cnblogs.com/sonicit/archive/2013/01/13/2858475.html
Handler,Looper,Message,Thread的用法:http://blog.youkuaiyun.com/fiendvip/article/details/50890289
在AppCompactActivity中的ActionBar中Menu隐藏后Item无法显示Icon,不是在onMenuOpened反射,而是在onPrepareOptionsPanel方法里面去反射
原文链接:http://www.jianshu.com/p/4b533d1fc7d4
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
文/ClownQiang(简书作者)
Handler当中内存泄露的问题:
下面这段代码是Handler发送的Message进入消息队列时必须调用的方法:
private boolean enqueueMessage(MessageQueue queue, Message msg, long uptimeMillis) {
msg.target = this; // 这个Message引用了Handler对象
if (mAsynchronous) {
msg.setAsynchronous(true);
}
return queue.enqueueMessage(msg, uptimeMillis);
}
可以看到发送到消息队列的Message对象持有一个发送该消息的Handler的引用,这样系统就可以调用Handler#handleMessage()方法来分发处理该消息。
那么泄漏发生在哪里呢?考虑下面一个例子:
public class MainActivity extends Activity {
Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mLeakyHandler.postDelayed(new Runnable() {
public void run() { }
}, 100000);
finish();
}
}
当Activity被finish之后,我们发出的那个延时消息将在主线程的消息队列中保持10分钟,直到该消息最终被处理,由于消息持有一个Handler引用,而Handler又持有一个它的外部类MainActivity的引用,这样就阻止了Activity被“垃圾回收”,从而泄漏了Activity引用的所有应用资源,注意上述例子中的匿名的Runnable对象也一样造成了Activity的泄漏。
一般来说,这种内存泄漏的情况通常不会发生,除非你发送了一个延时很长的消息。
(the handler class should be static or leaks might occur)这个警告便表示 Handler 应该宣告为 static 以免程序发生无法预期的问题。
但宣告为static 又无法使用 Activity 內的 function。这时就必需要用到 weakreference 这个类型的设计方法如此即可在 Handler 內存取 Activity 的成员
使用Static+WeakRefrences解决:http://2dxgujun.com/post/2014/09/11/Handler-Leaks-Solution.html 著作权归作者所有
使用按钮让viewpager左右滑动:arrawScroll(2)右,arrawScroll(1)左,
并且还想点击按钮实现缓慢(类似手滑动的效果)需细看:
http://blog.youkuaiyun.com/liyulei316686082/article/details/7616734
Java强引用、 软引用、 弱引用、虚引用:
http://my.oschina.net/ydsakyclguozi/blog/404389
http://www.2cto.com/kf/201207/139522.html