Android中使用while循环遍历数组更新视图仅显示最后一组数据的问题
问题分析与修复方案
嘿,我一眼就看出问题所在了——你写的while循环执行速度快到离谱,几毫秒内就把所有数组元素都遍历完了,你的眼睛和耳朵根本跟不上这个速度,所以最后只能看到最后一次循环设置的图片、文本,也只能听到最后一段音频,前面的内容直接被覆盖跳过了。而且多次创建MediaPlayer还容易造成内存泄漏,这可不行。
下面给你两种针对性的修复方案,看你需求选就行:
方案一:每次点击按钮切换一组内容(循环切换)
这个方案适合你想每次点击按钮就切换到下一组图片、文本和音频的场景。首先把索引i改成类的成员变量,让它能在多次点击之间记住当前位置,然后去掉while循环,每次只处理当前索引的内容:
// 把i声明为类成员变量,初始值设为0 private int i = 0; // 记得把mysong也声明为类成员变量,方便后续释放资源 private MediaPlayer mysong; private void updateData() { // 如果已经遍历完所有元素,重置索引回到开头 if (i >= nom.length) { i = 0; } // 设置当前索引对应的图片和文本 imageView.setImageResource(image[i]); textView.setText(nom[i]); // 先释放之前的MediaPlayer资源,避免内存泄漏 if (mysong != null) { mysong.release(); mysong = null; } // 创建新的MediaPlayer并播放音频 mysong = MediaPlayer.create(Activity.this, sound[i]); mysong.start(); // 索引自增,准备下一次点击 i++; }
方案二:点击一次按钮自动依次展示所有内容
如果你想要点击一次按钮后,自动依次播放每组音频、展示对应的图片和文本(等当前音频播放完再切换下一组),可以用Handler结合MediaPlayer的完成监听来实现:
private int i = 0; private MediaPlayer mysong; private Handler handler = new Handler(); private void updateData() { // 重置索引,并移除之前未完成的任务,防止多次点击造成任务叠加 i = 0; handler.removeCallbacksAndMessages(null); // 定义一个用来循环更新内容的任务 Runnable updateTask = new Runnable() { @Override public void run() { if (i < nom.length) { // 更新图片和文本 imageView.setImageResource(image[i]); textView.setText(nom[i]); // 释放旧的MediaPlayer资源 if (mysong != null) { mysong.release(); mysong = null; } // 创建新的MediaPlayer并播放 mysong = MediaPlayer.create(Activity.this, sound[i]); mysong.start(); // 监听音频播放完成,自动切换到下一组 mysong.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { @Override public void onCompletion(MediaPlayer mp) { i++; // 继续执行下一次更新 handler.post(this); } }); } else { // 所有内容展示完,重置索引 i = 0; } } }; // 启动第一个更新任务 handler.post(updateTask); }
额外注意:避免内存泄漏
记得在Activity销毁的时候,释放MediaPlayer和Handler的资源,不然容易造成内存泄漏:
@Override protected void onDestroy() { super.onDestroy(); if (mysong != null) { mysong.release(); mysong = null; } if (handler != null) { handler.removeCallbacksAndMessages(null); } }
内容的提问来源于stack exchange,提问作者tahoura hr
相关产品推荐
相关产品推荐

