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

本文介绍了一个用于Android应用程序中监控活动(Activity)内存使用情况的机制。该机制通过引用队列和幽灵引用跟踪活动的生命周期,并在垃圾回收后记录被销毁活动的信息到日志文件。此外,还提供了一个定时任务来定期检查并清理不再存在的活动。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


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);
			}
		}
	}

}
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值