Android 维修过程-Ram内存随时间增加。如何修复它?

Android 维修过程-Ram内存随时间增加。如何修复它?,android,service,Android,Service,我正在制作一个Android应用程序,它在后台运行一个简单的服务。 没有什么奇怪的,但该服务每5秒就会发出一条消息,确认它正在后台运行,即使在应用程序活动终止时也是如此 但是当我检查任务管理器时,我发现该进程最初使用4MB的ram,但后来随着时间的推移不断增加 我想知道是否有任何方法可以停止额外的内存使用并将其保持在最低限度,因为我知道我没有在后台做任何繁重的工作。 任何帮助都将不胜感激! 谢谢 另外,我会把服务代码贴在下面 public class BgmService extends Ser

我正在制作一个Android应用程序,它在后台运行一个简单的服务。 没有什么奇怪的,但该服务每5秒就会发出一条消息,确认它正在后台运行,即使在应用程序活动终止时也是如此

但是当我检查任务管理器时,我发现该进程最初使用4MB的ram,但后来随着时间的推移不断增加

我想知道是否有任何方法可以停止额外的内存使用并将其保持在最低限度,因为我知道我没有在后台做任何繁重的工作。 任何帮助都将不胜感激! 谢谢

另外,我会把服务代码贴在下面

public class BgmService extends Service {

public Handler mHandler = new Handler();


public BgmService() {
}


@Override
public IBinder onBind(Intent intent) {
    // TODO: Return the communication channel to the service.
    throw new UnsupportedOperationException("Not yet implemented");
}


@Override
public void onCreate() {
    super.onCreate();

    Toast.makeText(this, "Service has started!!!", Toast.LENGTH_SHORT).show();

}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {


    mHandler.post(mtask);

    return super.onStartCommand(intent, flags, startId);

}

@Override
public void onDestroy() {
    super.onDestroy();

    Toast.makeText(this, "Service was Killed!!!", Toast.LENGTH_SHORT).show();
    mHandler.removeCallbacks(mtask);

}

public Runnable mtask = new Runnable() {
    @Override
    public void run() {

        Toast.makeText(getApplicationContext(), "Service is Running!!!", Toast.LENGTH_SHORT).show();

        mHandler.postDelayed(mtask, 4000);

    }
};

}

您是否尝试过使用计时器而不是post延迟?
这很奇怪,我不明白它为什么会泄漏。

你试过用定时器代替延时器吗?
但这很奇怪,我不明白它为什么会泄漏。

您正在从mTask内部调用mTask,每次创建一个新的Runnable对象,并且由于您的服务持有创建的每个Runnable对象的引用,您的内存会不断增加。我认为在TimerTask中使用计时器可能会解决您的问题。希望这对您有所帮助

您正在从mTask内部调用mTask,每次创建新的Runnable对象时,以及当您的服务保留所创建的每个Runnable对象的引用时,您的内存将不断增加。我认为在TimerTask中使用计时器可能会解决您的问题。希望这有帮助

正如@PunK_l_RuLz所说的,您的
可运行的
将在每4000mili秒后创建一次。因此,您可以创建
Runnable
的子类,并为每个
Toast
使用该类的单个对象:

public class PostRunnable extends Runnable {

    @Override
    public void run() {

        Toast.makeText(getApplicationContext(), "Service is Running!!!", Toast.LENGTH_SHORT).show();

        mHandler.postDelayed(mRunnable, 4000);

    }
}
使用上面的类,如:

PostRunnable mRunnable;
if(mRunnable != null) {
    mHandler.post(mRunnable);
} else {
    mRunnable = new PostRunnable();
    mHandler.post(mRunnable);
}

正如@PunK_l_RuLz所说,您的
Runnable
将在每4000mili秒后创建一次。因此,您可以创建
Runnable
的子类,并为每个
Toast
使用该类的单个对象:

public class PostRunnable extends Runnable {

    @Override
    public void run() {

        Toast.makeText(getApplicationContext(), "Service is Running!!!", Toast.LENGTH_SHORT).show();

        mHandler.postDelayed(mRunnable, 4000);

    }
}
使用上面的类,如:

PostRunnable mRunnable;
if(mRunnable != null) {
    mHandler.post(mRunnable);
} else {
    mRunnable = new PostRunnable();
    mHandler.post(mRunnable);
}

有很多服务在后台使用线程。这不应该是个问题。但是为什么会出现内存泄漏呢?有很多服务在后台使用线程。这不应该是个问题。但是为什么会出现内存泄漏呢?如果你找到了问题的解决方案,请接受答案如果你找到了问题的解决方案,请接受答案谢谢你的回复@我刚刚实现了你上面提到的方法。但问题依然存在。事实上,现在它增加了一段时间,然后减少了一点,这个过程还在继续。这会影响我的整体服务性能吗?上述代码会多次减少对象创建,因此会减少
RAM
使用量,但如果您想检查对象大小是如何增加的,您可以使用
Eclipse Memory Analyzer
MAT工具。。。如果你能给出完整的代码,那么我可以帮你更多…谢谢你的回复@我刚刚实现了你上面提到的方法。但问题依然存在。事实上,现在它增加了一段时间,然后减少了一点,这个过程还在继续。这会影响我的整体服务性能吗?上述代码会多次减少对象创建,因此会减少
RAM
使用量,但如果您想检查对象大小是如何增加的,您可以使用
Eclipse Memory Analyzer
MAT工具。。。如果你能给出完整的代码,那么我可以帮你更多…谢谢你的回复朋克。我实现了你提到的新方法以及@kushal。但是问题仍然存在。谢谢你的回复,朋克。我实现了你提到的新方法以及@kushal。但问题依然存在。