Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ListView项onClickListener和垃圾收集器_Java_Android_Listview - Fatal编程技术网

Java ListView项onClickListener和垃圾收集器

Java ListView项onClickListener和垃圾收集器,java,android,listview,Java,Android,Listview,我有一个ListView和一个ArrayAdapter。在方法getView中,我在每个列表元素上创建按钮。 下面是我的方法代码onClick public void onClick(View view) { mediaPlayer = MediaPlayer.create(context, audioResourceId); mediaPlayer.start(); button.setBackgroundResource(R.drawable.ic_mic_press

我有一个ListView和一个ArrayAdapter。在方法getView中,我在每个列表元素上创建按钮。 下面是我的方法代码
onClick

public void onClick(View view) {
    mediaPlayer = MediaPlayer.create(context, audioResourceId);
    mediaPlayer.start();
    button.setBackgroundResource(R.drawable.ic_mic_pressed);
    mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
        public void onCompletion(MediaPlayer mp) {
            mp.release();
            button.setBackgroundResource(R.drawable.ic_mic);
        }
    });
}
因此,如果我点击一个按钮,滚动到列表的底部,声音就会被打断。我认为它被中断了,因为这个列表项不在屏幕上,被垃圾收集了


即使我将ListView滚动到底部或切换视图,如何使此声音一直播放到最后

您想创建一个单独的线程来保存您的
MediaPlayer
对象。当您单击按钮时,向该线程发送一条消息,告知您要播放的音频资源


最简单的方法可能是使用一个对象,它将管理您的线程并创建一个消息队列用于与之通信。

您想创建一个单独的线程来保存您的
MediaPlayer
对象。当您单击按钮时,向该线程发送一条消息,告知您要播放的音频资源


最简单的方法可能是使用一个对象,它将管理您的线程并创建一个与之通信的消息队列。

我想制作一些类似于静态方法的东西,在这里我可以发出我想要播放的声音。这行不通?是的,这会解决你眼前的问题。但一般来说,任何“繁重的工作”都不应该在UI线程上完成。即使有效,这种行为也会导致性能下降。不看MediaPlayer的内部结构,最好只是假设最坏的情况。(如果你真的想测试,你可以为你的应用程序打开严格模式,这将警告你UI线程上的任何阻塞I/O。)我需要处理程序做什么?我可以只单击CreateMythReadInstance(可以播放声音)并启动它吗?是的,您当然可以。但是,使用处理程序简化了许多常见的使用模式——特别是,如果需要,可以更轻松地更新UI。我在单独的线程中运行播放器,从该线程向处理程序发送消息以更新UI,但当我看不见时,声音仍然中断。我想做一些类似于静态的方法,在那里我可以发出我想要的声音。这行不通?是的,这会解决你眼前的问题。但一般来说,任何“繁重的工作”都不应该在UI线程上完成。即使有效,这种行为也会导致性能下降。不看MediaPlayer的内部结构,最好只是假设最坏的情况。(如果你真的想测试,你可以为你的应用程序打开严格模式,这将警告你UI线程上的任何阻塞I/O。)我需要处理程序做什么?我可以只单击CreateMythReadInstance(可以播放声音)并启动它吗?是的,您当然可以。然而,使用处理程序简化了许多常见的使用模式——特别是,如果需要的话,可以更轻松地更新UI。我在单独的线程中运行我的播放器,从该线程向处理程序发送消息以更新UI,但当我丢失视图时,声音仍然中断。