まず、私は自分自身を遅延を伴って実行するための簡単なタスクに設定しました。最初は実行可能ファイルを作成してnew Thread(runnable).start();
で実行しましたが、非静的な内部クラスがメモリリークを引き起こす可能性があるので、私はRunnable
を静的にしようとしました。(Android)静的ウィークリファレンスランタイムを実装しようとしています
私はIs this Runnable safe from memory leak?の例に続き、このコードで終了しました:
public class ApproxManager {
private Context mContext;
private AlarmManager mAlarmManager;
public ApproxManager(Context context){
mContext = context;
mAlarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
}
public void setPeriod(int type, long when, int extendCount){
Intent i = new Intent(mContext, OnAlarmReceiver.class);
long alarmtime = when;
i.putExtra(RReminder.PERIOD_TYPE, type);
i.putExtra(RReminder.EXTEND_COUNT, extendCount);
i.setAction(RReminder.CUSTOM_INTENT_APPROXIMATE_PERIOD_END);
PendingIntent pi = PendingIntent.getBroadcast(mContext, 0, i, PendingIntent.FLAG_CANCEL_CURRENT);
new Thread(new WeakRunnable(mContext, alarmtime,pi)).start();
}
public void setAlarm(long alarmTime, PendingIntent pi){
mAlarmManager.set(AlarmManager.RTC_WAKEUP, alarmTime, pi);
}
private static final class WeakRunnable implements Runnable {
private final WeakReference<Context> mContext;
long mAlarmtime;
PendingIntent mpi;
protected WeakRunnable(Context context, long alarmtime, PendingIntent pi){
mContext = new WeakReference<Context>(context);
mAlarmtime = alarmtime;
mpi = pi;
}
@Override
public void run() {
Context context = mContext.get();
if (context != null) {
try {
Thread.sleep(1500);
} catch (InterruptedException e) {
e.printStackTrace();
}
ApproxManager approxManager = new ApproxManager(context);
approxManager.setAlarm(mAlarmtime,mpi);
}
}
}
}
私は内部クラスと参照に慣れていないよ、私のコードにもかかわらず、動作しているように見えるので、私はとsuceededしている場合、私は、わかりません私の目標はメモリリークを避けることです。だから誰かが私のコードを見ることができたらうれしいです。
実際には解決策ではありますが、アクティビティの代わりにAplicationContextを使用すると、メモリリークを大幅に減らすことができます。つまり、リークが発生してもメモリ内にビジュアルリソースが保持されません。 – X3Btel
ああ、そうです。したがって、ApproxManagerクラスをインスタンス化するためにApplicationContextを使用すると、ApproxManagerがアクティビティを超えても親アクティビティがガベージコレクションされます。 – aphelion
はい、AplicationContextを使用している場合、ApproxManagerはアクティビティへの参照を保持しません – X3Btel