安卓 TextView 内存泄漏问题

3

我正在开发一个音乐应用程序,其中使用了SeekBar。我有一个处理SeekBar性能的方法,它运行良好。但是如果SeekBar在运动中存在内存泄漏,Log cat会显示如下:

GC_CONCURRENT freed 1692K, 34% free 10759K, paused 3ms+8ms

当进度条正在进行时,这个问题会持续出现。

我发现问题是由于动态更新TextView引起的,它用于显示歌曲的当前时长。

我应该如何解决这个问题?请帮我解决这个问题。

我的函数是:

public void seekbarProgress(){

        handler.postDelayed(new Runnable() {
            @Override
            public void run() {

                //current position of the play back 
                currPos = harmonyService.player.getCurrentPosition();
                if(isPaused){
                    //if paused then stay in the current position
                    seekBar.setProgress(currPos);
                    //exiting from method... player paused, no need to update the seekbar
                    return;
                }

                //checking if player is in playing mode
                if(harmonyService.player.isPlaying()){
                    //settting the seekbar to current positin
                    seekBar.setProgress(currPos);
                    //updating the cuurent playback time
                    currTime.setText(getActualDuration(""+currPos));
                    handler.removeCallbacks(this);
                    //callback the method again, wich will execute aftr 500mS
                    handler.postDelayed(this, 500);
                }
                //if not playing...
                else{
                    //reset the seekbar
                    seekBar.setProgress(0);
                    //reset current position value
                    currPos = 0;
                    //setting the current time as 0
                    currTime.setText(getActualDuration(""+currPos));
                    Log.e("seekbarProgress()", "EXITING");
                    //exiting from the method
                    return;
                }
            }
        }, 500);
    }

为什么你想在每次SeekBar进度改变时都更新音轨长度?你可以在MediaPlayer准备好后只更新一次。 - Rotem
我想要在一个Textview中更新当前的寻找时间,还有一个Textview用于显示歌曲的完整时长,这个Textview用于显示正在播放的歌曲的当前时间。 - Arundas K V
你多久改变一次SeekBar的进度?如果你的文本中不显示毫秒,你可以创建一个线程,每秒根据SeekBar更新TextView。 - Rotem
我的目标是:如果一首歌曲的最大时长为10000毫秒,则我的一个文本视图maxTime(在此方法之外)将显示为00:10,通过在方法getActualDuration(timeInMillis)中传递毫秒数... 需要再显示一个TextView currTime,作为歌曲的当前位置。例如:当歌曲开始播放时,它被设置为0,然后在1秒后更新为00:01、00:02、00:03等,直到00:10...就像这样 - Arundas K V
你所展示的logcat条目并不意味着内存泄露,它只是垃圾回收器在执行它的工作。我怀疑这个""+currPos语句会导致大量的垃圾回收。请阅读有关Java“不可变字符串”的相关资料。 - Simon
好的,谢谢。getActualDuration()是一个方法,它接受一个以毫秒为形式的字符串变量,并返回一个以实际时间表示的字符串。例如:10000ms转换为00:10。currPos是一个整数变量,尝试将其转换为字符串。 - Arundas K V
1个回答

2

GC_CONCURRENT 行并不意味着您有内存泄漏。它只是垃圾收集器清理未使用的内存。

编辑: 这行代码:

currTime.setText(getActualDuration(""+currPos));

不会产生内存泄漏(除非getActualDuration()做了一些有趣的事情)。它只是每500毫秒创建一个新的String,但这并不会导致内存泄漏。旧的字符串将像您的情况一样被垃圾回收。


谢谢,但是在这种情况下我如何避免浪费内存。当我注释掉这一行currTime.setText(getActualDuration(""+currPos));时,没有GC_CONCURRENT,也就没有释放未使用的内存。我很困惑。 - Arundas K V
你在说哪一行代码?在Java中,通常不需要过于担心内存泄漏问题。如果有未使用的对象,它会自动释放(除非你在某个地方保留了对它的引用)。 - Caner
(在Android上工作)这行代码:currTime.setText(getActualDuration(""+currPos));在Log cat中,类似于以下的消息会持续出现:GC_CONCURRENT freed 1692K, 34% free 10759K, paused 3ms+8ms这会导致任何性能问题吗? - Arundas K V
检查我的编辑,那可能是导致日志中出现这些消息的行,但它没问题。 - Caner
是的,我知道GC_CONCURRENT是由于这一行代码引起的,但不知道该如何修复。必须每秒钟显示currTime。 - Arundas K V

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接