SoftReference 为什么被 Android “q 桌面被放弃了吗”

开发AIDL并不难,但繁琐的步骤和细节,如果稍不注意,就容易“入坑”,本博客主要介绍AIDL的相关注意事项,在最后会附上AIDL的实例项目,包括客户端和服务端供大家下载参考。需要注意的地方有:1.在Android Studio里开发AIDL很方便,我们先开发Service端。新建一个项目之后,直接File –& New –& Folder –& AIDL Folder,就会在项目出现一个aidl文件...
public void registerUsbReceiver(Context context) {
IntentFilter filter = new IntentFilter();
filter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED);
filter.addAction(UsbManager.ACTION_USB_...
用eclipse可以很方便导出jar包,而使用AndroidStudio可以导出aar文件,rebuild之后,在project视图下的build–&outputs–&aar目录下可以找到aar文件。
http://blog.csdn.net/getchance/article/details/而细心的同学也会发现,jar包其实也同时生成了,就在build–&intermediat...
场景描述:
现在打开了Activity A,点击A的某一个控件,将执行耗时的操作,此时用户点击HOME键到桌面去了,过了一会儿,A中的耗时操作执行完了,将会启动一个新的Activity B,我们想要的效果是B在后台“静默”启动,而不是突然弹出来(如果不做特殊处理,在4.4以上会突然弹出来)。实现思想:
安卓似乎并没有开放后台启动Activity的方法(如有还请告知),所以关键在于点击HOME键这...
MainActivity.java:
import android.content.C
import android.net.wifi.WifiC
import android.net.wifi.WifiM
import android.os.H
import and...
MainActivity.java:
import android.content.C
import android.net.wifi.ScanR
import android.net.wifi.WifiC
import android.net.wifi.WifiM...
Service端的清单文件:
permission android:name=&com.aa& /&
uses-permission android:name=&com.aa& /&
Service配置:
android:name=&com.pax.pay.service.PaymentService&
android:permission=&com....
MainActivity:
import android.content.I
import android.os.B
import android.support.v7.app.AppCompatA
import android.util.L
import android.view.Vie...
CrashHandler:
import android.util.L
* Created by zhanzc on .
public class CrashHandler implements Thread.UncaughtExceptionHandler {
@Overrid...
发生内存泄露的场景:
场景1:静态变量引用Activity对象
场景2:静态View
场景3:内部类和匿名类
场景4:Handler
场景5:Threads和TimerTask
场景6:监听器
场景7:静态集合对象引起的泄漏
场景8:资源对象未关闭
场景9:使用对象池避免频繁创建对象
场景10:Back键退出引起的泄漏
现在有这么一个场景(场景3|场景6):在Activit...
package com.smart.mirrorer.import android.content.C
import android.support.v4.view.ViewP
import android.util.AttributeS
import android.view.MotionEpublic class ScrollableViewPa...
出现这个错误一般是在高版本的AndroidStudio里导入旧版本的gradle项目,需要:
1. 打开build.gradle(Project :)文件,按下图提示修改classpath:
2. 打开gradle/wrapper/gradle-wrapper.properties文件,修改distributionUrl为distributionUrl=http://services.gra...
JDK 中除了默认的 Strong Reference 之外,还有三个其他的 Reference:
WeakReference
SoftReference
PhantomReference
他们都是为了更高效地利用 Heap。
WeakReference
如果一个变量的 Reference 只剩下 WeakReference,那么 GC 会毫不留情地把这个变量回收掉。也就是说,WeakR...
* 插入到相册
* @param picName 在相册中的名称(并不是文件名,更类似于title)
private void insertIntoAlbum(String picName) {
// 保证相册只存一张我们的图片
String lastUrl = PreferencesTool.getString(t...
配置类:package com.itant.zhuling.tool.image.import android.content.Cimport com.bumptech.glide.G
import com.bumptech.glide.GlideB
import com.bumptech.glide.load.engine.bitmap_recyc...
使用单例模式维护一个特定配置的请求客户端package com.itant.zhuling.tool.import android.content.Cimport java.util.concurrent.TimeUimport okhttp3.C
import okhttp3.OkHttpC/**
* Created by Jason on 2...
RelativeLayout xmlns:android=&/apk/res/android&
android:id=&@+id/activity_main&
android:layout_width=&match_parent&
android:layout_height=&match_parent&
attrs.xml:
&attr name=&imageWidth& format=&dimens...
values下新建attrs.xml:
&attr name=&text& format=&string& localization=&su...
定义一个接口:package com.itant.zhuling./**
* Created by Jason on .
*/public interface IPermission {
void onPermissionSuccess(int requestCode);
void onPermissionFail(int requestCode);...
访问:333576次
积分:4694
积分:4694
排名:第6496名
原创:162篇
转载:148篇
评论:32条
(4)(2)(4)(1)(6)(25)(16)(3)(1)(21)(5)(8)(1)(3)(8)(5)(3)(4)(17)(7)(8)(4)(8)(9)(12)(8)(13)(4)(7)(7)(7)(15)(25)(10)(14)(18)
(window.slotbydup = window.slotbydup || []).push({
id: '4740881',
container: s,
size: '200,200',
display: 'inlay-fix' 上传我的文档
 下载
 收藏
该文档贡献者很忙,什么也没留下。
 下载此文档
Android面试重点项目回答笔记
下载积分:2588
内容提示:Android面试重点项目回答笔记
文档格式:DOCX|
浏览次数:0|
上传日期: 16:35:27|
文档星级:
全文阅读已结束,如果下载本文需要使用
 2588 积分
下载此文档
该用户还上传了这些文档
Android面试重点项目回答笔记
官方公共微信温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
I want to live idle lives...
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
阅读(1253)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
在LOFTER的更多文章
loftPermalink:'',
id:'fks_',
blogTitle:'SoftReference的用法',
blogAbstract:'SoftReference的语义就是当内存不够用的时候,GC会回收SoftReference所引用的对象。所以,在memory sensitive的程序中将某些大型数据设置成SoftReference再合适不过了。 \r\n创建一个SoftReference: \r\nObject obj = new Object();& &&&&&& SoftReference softRef = new SoftReference(obj);& ',
blogTag:'',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:0,
publishTime:3,
permalink:'blog/static/',
commentCount:0,
mainCommentCount:0,
recommendCount:0,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'I want to live idle lives...',
hmcon:'1',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}Android内存管理_SoftReferences的使用
转载自:http://blog.csdn.net/kavendb/article/details/5935577
本文介绍对象的强、软、弱和虚引用的概念、应用。
1.对象的强、软、弱和虚引用
1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无法再使用这个对象。也就是说,只有对象处于可触及(reachable)状态,程序才能使
用它。从JDK
1.2版本开始,把对象的引用分为4种级别,从而使程序能更加灵活地控制对象的生命周期。这4种级别由高到低依次为:强引用、软引用、弱引用和虚引用。图
1为对象应用类层次。
⑴强引用(StrongReference)
强引用是使用最普遍的引用。如果一个对象具有强引用,那垃圾回收器绝不会回收它。当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题。
⑵软引用(SoftReference)
&&&&如果一个对象只具有软引用,则内存空间足够,垃圾回收器就不会回收它;如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。软引用可用来实现内存敏感的高速缓存(下文给出示例)。
软引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被垃圾回收器回收,Java虚拟机就会把这个软引用加入到与之关联的引用队列中。
⑶弱引用(WeakReference)
&&&&弱引用与软引用的区别在于:只具有弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具有
弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。不过,由于垃圾回收器是一个优先级很低的线程,因此不一定会很快发现那些只具有弱引用的对
弱引用可以和一个引用队列(ReferenceQueue)联合使用,如果弱引用所引用的对象被垃圾回收,Java虚拟机就会把这个弱引用加入到与之关联的引用队列中。
⑷虚引用(PhantomReference)
&&&&“虚引用”顾名思义,就是形同虚设,与其他几种引用都不同,虚引用并不会决定对象的生命周期。如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收。
虚引用主要用来跟踪对象被垃圾回收器回收的活动。虚引用与软引用和弱引用的一个区别在于:虚引用必须和引用队列
(ReferenceQueue)联合使用。当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之
关联的引用队列中。
ReferenceQueue queue = new ReferenceQueue ();
PhantomReference pr = new PhantomReference (object, queue);
&&&程序可以通过判断引用队列中是否已经加入了虚引用,来了解被引用的对象是否将要被垃圾回收。如果程序发现某个虚引用已经被加入到引用队列,那么就可以在所引用的对象的内存被回收之前采取必要的行动。
2.对象可及性的判断
在很多时候,一个对象并不是从根集直接引用的,而是一个对象被其他对象引用,甚至同时被几个对象所引用,从而构成一个以根集为顶的图形结构。如图2所示
&&在这个树形的引用链中,箭头的方向代表了引用的方向,所指向的对象是被引用对象。由图可以看出,从根集到一个对象可以由很多条路径。比如到达对象5的路径就有①-⑤,③-⑦两条路径。由此带来了一个问题,那就是某个对象的可及性如何判断:
◆单条引用路径可及性判断:在这条路径中,最弱的一个引用决定对象的可及性。
◆多条引用路径可及性判断:几条路径中,最强的一条的引用决定对象的可及性。
比如,我们假设图2中引用①和③为强引用,⑤为软引用,⑦为弱引用,对于对象5按照这两个判断原则,路径①-⑤取最弱的引用⑤,因此该路径对对象5的引用为软引用。同样,③-⑦为弱引用。在这两条路径之间取最强的引用,于是对象5是一个软可及对象。
3.使用软引用构建敏感数据的缓存
3.1 为什么需要使用软引用
&&&&首先,我们看一个雇员信息查询系统的实例。我们将使用一个Java语言实现的雇员信息查询系统查询存储在磁盘文件或者数据库中的雇员人事档
案信息。作为一个用户,我们完全有可能需要回头去查看几分钟甚至几秒钟前查看过的雇员档案信息(同样,我们在浏览WEB页面的时候也经常会使用“后退”按
钮)。这时我们通常会有两种程序实现方式:一种是把过去查看过的雇员信息保存在内存中,每一个存储了雇员档案信息的Java对象的生命周期贯穿整个应用程
序始终;另一种是当用户开始查看其他雇员的档案信息的时候,把存储了当前所查看的雇员档案信息的Java对象结束引用,使得垃圾收集线程可以回收其所占用
的内存空间,当用户再次需要浏览该雇员的档案信息的时候,重新构建该雇员的信息。很显然,第一种实现方法将造成大量的内存浪费,而第二种实现的缺陷在于即
使垃圾收集线程还没有进行垃圾收集,包含雇员档案信息的对象仍然完好地保存在内存中,应用程序也要重新构建一个对象。我们知道,访问磁盘文件、访问网络资
源、查询数据库等操作都是影响应用程序执行性能的重要因素,如果能重新获取那些尚未被回收的Java对象的引用,必将减少不必要的访问,大大提高程序的运
3.2 如何使用软引用
&&&&SoftReference的特点是它的一个实例保存对一个Java对象的软引用,该软引用的存在不妨碍垃圾收集线程对该Java对象的回
收。也就是说,一旦SoftReference保存了对一个Java对象的软引用后,在垃圾线程对这个Java对象回收前,SoftReference类
所提供的get()方法返回Java对象的强引用。另外,一旦垃圾线程回收该Java对象之后,get()方法将返回null。
看下面代码:
MyObject aRef = new?MyObject();
SoftReference aSoftRef=new SoftReference(aRef);
此时,对于这个MyObject对象,有两个引用路径,一个是来自SoftReference对象的软引用,一个来自变量aReference的强引用,所以这个MyObject对象是强可及对象。
随即,我们可以结束aReference对这个MyObject实例的强引用:
&&&此后,这个MyObject对象成为了软可及对象。如果垃圾收集线程进行内存垃圾收集,并不会因为有一个SoftReference对该对象
的引用而始终保留该对象。Java虚拟机的垃圾收集线程对软可及对象和其他一般Java对象进行了区别对待:软可及对象的清理是由垃圾收集线程根据其特定
算法按照内存需求决定的。也就是说,垃圾收集线程会在虚拟机抛出OutOfMemoryError之前回收软可及对象,而且虚拟机会尽可能优先回收长时间
闲置不用的软可及对象,对那些刚刚构建的或刚刚使用过的“新”软可反对象会被虚拟机尽可能保留。在回收这些对象之前,我们可以通过:
MyObject anotherRef=(MyObject)aSoftRef.get();
重新获得对该实例的强引用。而回收之后,调用get()方法就只能得到null了。
3.3 使用ReferenceQueue清除失去了软引用对象的SoftReference
&&&&作为一个Java对象,SoftReference对象除了具有保存软引用的特殊性之外,也具有Java对象的一般性。所以,当软可及对象
被回收之后,虽然这个SoftReference对象的get()方法返回null,但这个SoftReference对象已经不再具有存在的价值,需要
一个适当的清除机制,避免大量SoftReference对象带来的内存泄漏。在java.lang.ref包里还提供了ReferenceQueue。
如果在创建SoftReference对象的时候,使用了一个ReferenceQueue对象作为参数提供给SoftReference的构造方法,
ReferenceQueue queue = new?ReferenceQueue();
SoftReference?ref=new?SoftReference(aMyObject, queue);
&&&&那么当这个SoftReference所软引用的aMyOhject被垃圾收集器回收的同时,ref所强引用的SoftReference
对象被列入ReferenceQueue。也就是说,ReferenceQueue中保存的对象是Reference对象,而且是已经失去了它所软引用的
对象的Reference对象。另外从ReferenceQueue这个名字也可以看出,它是一个队列,当我们调用它的poll()方法的时候,如果这个
队列中不是空队列,那么将返回队列前面的那个Reference对象。
在任何时候,我们都可以调用ReferenceQueue的poll()方法来检查是否有它所关心的非强可及对象被回收。如果队列为空,将返回一个
null,否则该方法返回队列中前面的一个Reference对象。利用这个方法,我们可以检查哪个SoftReference所软引用的对象已经被回
收。于是我们可以把这些失去所软引用的对象的SoftReference对象清除掉。常用的方式为:
SoftReference ref =
while ((ref = (EmployeeRef) q.poll()) != null) {
&& // 清除ref
理解了ReferenceQueue的工作机制之后,我们就可以开始构造一个Java对象的高速缓存器了。
3.4通过软可及对象重获方法实现Java对象的高速缓存
&&&&利用Java2平台垃圾收集机制的特性以及前述的垃圾对象重获方法,我们通过一个雇员信息查询系统的小例子来说明如何构建一种高速缓存器来避免重复构建同一个对象带来的性能损失。我们将一个雇员的档案信息定义为一个Employee类:
public class Employee {
&&private S//
雇员的标识号码
&&private S//
&&private S//
该雇员所在部门
&&private String P//
该雇员联系电话
该雇员薪资
&&private S//
该雇员信息的来源
// 构造方法
public Employee(String id) {&
getDataFromlnfoCenter();
// 到数据库中取得雇员信息
private void getDataFromlnfoCenter() {
和数据库建立连接井查询该雇员的信息,将查询结果赋值
给name,department,plone,salary等变量
&&// 同时将origin赋值为"From
&&&这个Employee类的构造方法中我们可以预见,如果每次需要查询一个雇员的信息。哪怕是几秒中之前刚刚查询过的,都要重新构建一个实例,这是需要消耗很多时间的。下面是一个对Employee对象进行缓存的缓存器的定义:
import java.lang.ref.ReferenceQ
import java.lang.ref.SoftR
import java.util.H
public class EmployeeCache {
&& static private EmployeeCache
// 一个Cache实例
&& private
Hashtable&&String,EmployeeRef&
employeeR// 用于Chche内容的存储
&& private
ReferenceQueue&&Employee&
q;// 垃圾Reference的队列
继承SoftReference,使得每一个实例都具有可识别的标识。
&&&&&private
class EmployeeRef extends
SoftReference&&Employee&
private String _key = "";
public EmployeeRef(Employee em,
ReferenceQueue&&Employee&
super(em, q);
_key = em.getID();
&&// 构建一个缓存器实例
&&& private
EmployeeCache() {
employeeRefs = new Hashtable();
q = new ReferenceQueue();
取得缓存器实例
public static EmployeeCache getInstance() {
&&& if (cache ==
cache = new EmployeeCache();
&&& return
以软引用的方式对一个Employee对象的实例进行引用并保存该引用
&& private void
cacheEmployee(Employee em) {
cleanCache();// 清除垃圾引用
EmployeeRef ref = new EmployeeRef(em, q);
employeeRefs.put(em.getID(), ref);
依据所指定的ID号,重新获取相应Employee对象的实例
&&& public
Employee getEmployee(String ID) {
Employee em =
// 缓存中是否有该Employee实例的软引用,如果有,从软引用中取得。
if (employeeRefs.containsKey(ID)) {
EmployeeRef ref = (EmployeeRef) employeeRefs.get(ID);
em = (Employee) ref.get();
// 如果没有软引用,或者从软引用中得到的实例是null,重新构建一个实例,
// 并保存对这个新建实例的软引用
if (em == null) {
&& em = new Employee(ID);
System.out.println("Retrieve From EmployeeInfoCenter. ID=" +
this.cacheEmployee(em);
private void cleanCache() {
&& EmployeeRef ref =
&& while ((ref = (EmployeeRef)
q.poll()) != null) {
employeeRefs.remove(ref._key);
// 清除Cache内的全部内容
public void clearCache() {
&& cleanCache();
employeeRefs.clear();
System.gc();
System.runFinalization();
注:原来ReferenceQueue起到一
个监听器的效果,当发现SoftReference.get()方法返回的是null值时,就会将SoftReference注册到自己里面队列里,当我
们调用ReferenceQueue的poll()方法时,返回并删除该SoftReference。
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。2554人阅读
Android(32)
JDK 中除了默认的 Strong Reference 之外,还有三个其他的 Reference:
WeakReference
SoftReference
PhantomReference
他们都是为了更高效地利用 Heap。
WeakReference
如果一个变量的 Reference 只剩下 WeakReference,那么 GC 会毫不留情地把这个变量回收掉。也就是说,WeakReference 没有能力能够让这个变量可以在内存中再飞一会。
Android 开发者应该都了解 WeakReference 的用法,一个比较典型的应用场景是 Handler ,为了避免 Memory Leak,我们会定义一个内部静态类,然后以 WeakReference 的形式引用 Activity,这样一来,队列中的 Message (可能会排队很长时间)就不会干扰到 GC 回收 Activity。
public class MainActivity extends Activity {
private static final int MSG_ID = 0x00;
public void testSafeHandler() {
SafeHandler handler = new SafeHandler(this);
handler.sendEmptyMessage(MSG_ID);
public static class SafeHandler extends Handler {
private WeakReference&Activity& mActivityR
public SafeHandler(Activity activity) {
mActivityRef = new WeakReference&&(activity);
public void handleMessage(Message msg) {
switch (msg.what) {
case MSG_ID:
Activity activity = mActivityRef.get();
if (activity != null) {
activity.finish();
SoftReference
来看,只有当内存告急(即将 OOM)时,才会对只剩下 Soft Reference 的变量进行回收,因此 SoftReference 比较适合用来做 Cache:
Soft references are most often used to implement memory-sensitive caches.
对此持不同意见:
In practice, soft references are inefficient for caching.
因为 SoftReference 无法提供足够的信息可以让 runtime 很轻松地决定 clear 它还是 keep 它。举个例子,如果有 10 个 SoftReference 变量,并且他们所引用的变量都没有了 Strong Reference,那么 runtime 就懵逼了,因为它不知道该 clear 哪几个或者 keep 哪几个。更要命的是,runtime 不知道应该是 clear 掉 SoftReference 还是增大 Heap。
所以 Android 放弃了 SoftReference,推荐使用 android.util.LruCache 做 Cache 管理,至少 LruCache 可以根据变量的使用频次来决定是否应该 clear 掉它,这样就比单纯使用 SoftReference 多了一个决策条件 - 使用频次。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:942362次
积分:9102
积分:9102
排名:第2132名
原创:174篇
转载:27篇
评论:229条
阅读:12129
阅读:71722
(window.slotbydup = window.slotbydup || []).push({
id: '4740881',
container: s,
size: '200,200',
display: 'inlay-fix'}

我要回帖

更多关于 熊猫思嘉为什么被放弃 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信