Android进度条内存泄漏

Android进度条内存泄漏,android,memory-leaks,progress-bar,Android,Memory Leaks,Progress Bar,我有一个进度条(使用setProgress())每100毫秒从android倒计时更新一次。出于某种原因,每当计时器运行时,在android内存图中,都会出现内存泄漏(稳步增加)。你知道为什么会这样吗 final int waitTime = Integer.parseInt(PreferenceManager.getDefaultSharedPreferences(getApplicationContext()) .getString("answer_view_time

我有一个进度条(使用setProgress())每100毫秒从android倒计时更新一次。出于某种原因,每当计时器运行时,在android内存图中,都会出现内存泄漏(稳步增加)。你知道为什么会这样吗

final int waitTime = Integer.parseInt(PreferenceManager.getDefaultSharedPreferences(getApplicationContext())
            .getString("answer_view_time", "2000"));
    final int countFrom = timerWidget.getProgress();
    CountDownTimer answerTimer = new CountDownTimer(waitTime, 100) {
        @Override
        public void onTick(long millisUntilFinished) {
            //count up the time for the user to see his answer from where the timer had just left off
            timerWidget.setProgress(countFrom +(int) ( ( ( (waitTime - millisUntilFinished) ) / (float) waitTime )
                    * (timerWidget.getMax() - countFrom) ) );
        }

        @Override
        public void onFinish() {
            mQuiz.next();
            setQuestion(mQuiz.getCurrent());

            btn1.setEnabled(true);
            btn2.setEnabled(true);
            btn3.setEnabled(true);
            btn4.setEnabled(true);

            findViewById(R.id.main_conteiner).setBackgroundDrawable(getResources().getDrawable(R.drawable.background_colored));
        }
    }.start();
这在timerWidget.setProgress(…)中泄漏;线路。如果我把它注释掉,泄漏就停止了

更新:
我找不到发生这种事的任何理由。即使在一个活动中,当通过循环更新进度条时,似乎也存在内存泄漏。也许这是安卓本身的一个缺陷?我在联想设备上使用安卓5.1。

您遇到的一个问题是,您的匿名CountDownTimer类引用了它声明的类(变量countFrom和waitTime)。这意味着只要倒计时存在,外部类就永远不会被垃圾收集。如果您没有显式地在暂停或恢复此活动/片段时终止CountDownTimer,那么在每次重新加载计时器时,将有许多外部类和匿名CountDownTimer引用不会被垃圾收集

不要在匿名类中使用countFrom和waitTime引用(而是创建函数getCountFrom(),getWaitTime())-对于mQuiz、btn1等也一样。不要直接引用匿名类之外的类变量

有关更多信息-

[内部类]继续,假设我们在活动类的定义中定义了一个类,称为内部类。程序员选择这样做的原因有很多,包括增加可读性和封装性。如果我们创建这个内部类的一个实例并维护对它的静态引用会怎么样?此时,您不妨猜测内存泄漏即将发生

[匿名类]类似地,匿名类还将维护对它们在其中声明的类的引用。因此,如果在活动中匿名声明和实例化异步任务,则可能发生泄漏。如果它在活动被销毁后继续执行后台工作,则对该活动的引用将持续存在,并且在后台任务完成之前不会对其进行垃圾收集


这将是很好的,所以看到一些代码。你是对的。我编辑了我的帖子你是如何声明timerWidget的?它是对我的布局xml中进度条的引用,在onCreate()方法中用findViewById(…)初始化;我认为这是android内存泄漏,我也看到过。只要progressbar运行,使用的内存就会稳步增加。我不再有这个项目的源代码,所以我无法测试它-我问这个问题已经一年了。谢谢你的回答,很高兴知道。