工具类:用于监听Activity的创建和内存级回收情况,防止Activity Leaking

import java.io.BufferedOutputStream;
import java.io.Closeable;
import java.io.FileOutputStream;
import java.io.IOException;
import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Timer;
import java.util.TimerTask;


import android.app.Activity;
import android.content.Context;


public final class ActivityMemoryMonitor
{
private final static ReferenceQueue<Activity> referenceQueue = new ReferenceQueue<Activity>();
private final static Map<PhantomReference<Activity>, String> phantomReferenceMap = new HashMap<PhantomReference<Activity>, String>();


private final static String logFile = "activity_memory_monitor.log";


private static Timer memoryMonitorTimer = null;


public static void setActivityToMonitoringQueue(Activity activity)
{
String activityInfo = activity.toString() + "." + activity.hashCode();
phantomReferenceMap.put(new PhantomReference<Activity>(activity, referenceQueue), activityInfo);
writeLogToFile(activity, "Activity Created: " + activityInfo);


startMonitoringIfNeeded(activity.getApplicationContext());
}


private static void startMonitoringIfNeeded(Context context)
{
if (memoryMonitorTimer != null)
{
return;
}
memoryMonitorTimer = new Timer();
memoryMonitorTimer.schedule(new MemoryMonitorTask(context), 0, 2000);
}


private static synchronized void writeLogToFile(Context context, String message)
{
FileOutputStream fos = null;
BufferedOutputStream out = null;
try
{
fos = context.openFileOutput(logFile, Context.MODE_APPEND);
out = new BufferedOutputStream(fos);
String log = new Date().toString() + "  " + message + "\n";
out.write(log.getBytes());
} catch (IOException e)
{
} finally
{
close(out);
close(fos);
}
}


private static void close(Closeable c)
{
if (c == null)
{
return;
}


try
{
c.close();
} catch (IOException e)
{
}


}


private static class MemoryMonitorTask extends TimerTask
{
private Context context;


MemoryMonitorTask(Context context)
{
this.context = context;
}


@Override
public void run()
{
System.gc();


Object o = ActivityMemoryMonitor.referenceQueue.poll();
if (o != null)
{
writeLogToFile(context, "GC Cllected: " + phantomReferenceMap.get(o));
phantomReferenceMap.remove(o);
}
}
}

}

参考文章:http://www.iteye.com/topic/1117008

引出几个知识点:
Java 中一共有 4 种类型的引用 : StrongReference、 SoftReference、 WeakReference 以及 PhantomReference (传说中的幽灵引用 呵呵),
详细查看:http://www.douban.com/note/155272515/

小知识点:在内存中写文件

  1. private static synchronized void writeLogToFile(Context context, String message)  
  2.     {  
  3.         FileOutputStream fos = null;  
  4.         BufferedOutputStream out = null;  
  5.         try  
  6.         {  
  7.             fos = context.openFileOutput(logFile, Context.MODE_APPEND);  //写在手机内存中
  8.             out = new BufferedOutputStream(fos);  
  9.             String log = new Date().toString() + "  " + message + "\n";  
  10.             out.write(log.getBytes());  
  11.         } catch (IOException e)  
  12.         {  
  13.         } finally  
  14.         {  
  15.             close(out);  
  16.             close(fos);  
  17.         }  
  18.     }  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值