- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在创建一个简单的应用程序,其中包含一个 TextView 和 ImageButton View ,我使用 RecyclerView 来显示这些 View 对的列表,以便我编写了自定义适配器和 View 支架。但我有一个问题,如何在用户进入主屏幕时释放 MediaPlayer 。因为我在适配器内初始化 MediaPlayer ,并且我不知道如果 Activity 停止如何触发释放。这是我的代码:
Activity 类别:
public class NumbersActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_word_list);
List<Word> words = new ArrayList<>();
words.add(new Word("one", R.raw.number_one));
words.add(new Word("two", R.raw.number_two));
words.add(new Word("three", R.raw.number_three));
words.add(new Word("four", R.raw.number_four));
words.add(new Word("five", R.raw.number_five));
LinearLayoutManager numbersListLayoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
RecyclerView listView = findViewById(R.id.word_list);
listView.setLayoutManager(numbersListLayoutManager);
listView.setAdapter(new WordAdapter(this, words));
}
}
适配器类:
public class WordAdapter extends RecyclerView.Adapter<WordAdapter.ViewHolder> {
private Context context;
private List<Word> words;
private MediaPlayer mediaPlayer;
public WordAdapter(Context context, List<Word> words) {
this.context = context;
this.words = words;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View viewItem = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item, parent, false);
return new ViewHolder(viewItem);
}
@Override
public void onViewDetachedFromWindow(@NonNull ViewHolder holder) {
super.onViewDetachedFromWindow(holder);
stopPlaying();
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
holder.englishTranslation.setText(this.words.get(position).getDefaultTranslation());
holder.itemView.setOnClickListener((view) -> {
stopPlaying();
mediaPlayer = MediaPlayer.create(this.context, this.words.get(position).getAudioResourceId());
mediaPlayer.setOnCompletionListener((mp) -> {
stopPlaying();
});
mediaPlayer.start();
});
}
@Override
public int getItemCount() {
return words.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
TextView englishTranslation;
ImageButton playButton;
public ViewHolder(View wordView) {
super(wordView);
this.englishTranslation = wordView.findViewById(R.id.english_text_view);
this.playButton = wordView.findViewById(R.id.play_button);
}
}
private void stopPlaying() {
if (mediaPlayer != null && mediaPlayer.isPlaying()) {
mediaPlayer.stop();
mediaPlayer.reset();
mediaPlayer.release();
mediaPlayer = null;
}
}
}
我应该将 MediaPlayer 对象传递给适配器并从 Activity 类控制它的状态吗?或者是否可以从适配器内部执行此操作?
最佳答案
@Override
public void onViewDetachedFromWindow(@NonNull ViewHolder holder) {
super.onViewDetachedFromWindow(holder);
stopPlaying();
}
此处您要设置停止播放器。
当ViewHolder
在屏幕上不可见时触发
您应该将播放器实例放在 Activity 中,并通过适配器的接口(interface)回调(监听器模式)来控制它。
此外,使用单个媒体播放器而不是多个内部 VH
的性能会更好
回调应如下所示:
interface PlayableItemCallback {
void onItemVisible(int position);
void onPlay(int position);
void onStop(int position);
}
在您的 Activity 中实现它,并使用它来控制您的 MediaPlayer,并将其传递给适配器。 Activity 代码:
public class NumbersActivity extends AppCompatActivity implements PlayableItemCallback {
MediaPlayer mediaPlayer;
Adapter adapter = Adapter(this)
// .............
@Override
public void onItemVisible(int position) {
// do stuff with player
}
@Override
public void onPlay(int position) {
// do stuff with player
}
@Override
public void onStop(int position) {
// do stuff with player
}
}
关于java - 当 Activity onStop 被触发时,RecyclerView 释放 MediaPlayer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61054751/
我正在阅读有关 Activity 生命周期方法的文档 here 这是文档中表格的快照。 onStop() 方法在此处被标记为可终止。但是,尚不清楚 Activity 何时可以终止 - 在基础 Acti
我想实现某种监视功能,该功能可以告诉我我的应用何时崩溃或停止或暂停。因此,我有3个 Activity ,到目前为止我已经实现了,以便在mainActivity中调用onPause时,它会向我发送一封邮
我有一个应用程序,其 onStop() 方法中有一个 while 循环。在日志中我发现了这一行: 07-06 08:35:43.616 W/ActivityManager( 837): Activi
是否可以让 SFML 1.6 自行处理音乐结尾?目前我有这个: //in music.cpp music.Play() //in main.cpp //on every frame check for
简介:我做了一个淡出/淡入淡出所有 View 的不透明度。我想在切换 Activity 之间制作动画。我现在必须将淡入/淡出添加到每个 Activity 中的每个 onStop/onResume。 问
我想制作一个无法被杀死或破坏的应用程序。我试过了 @Override public void onStop() { super.onPause(); } 但这不起作用,应用程序仍然被杀死。那
我的应用程序从服务接收消息,它必须对其执行一些处理。在此之前,它必须连接到另一个服务 (GoogleApiClient)。发生的情况是应用程序调用 onStop 之前 GoogleApiClient
我尝试使用onStop()方法,但调用时代码并未执行。 我正在使用 TabHost 从一个 Activity 移动到另一个 Activity 。 当我移动到另一个选项卡时,此代码应该可以工作。 @Ov
我正在尝试获取 Activity 生命周期的日志。我在这里遇到了一些奇怪的问题。 当我将 Activity 的主题用作 android:theme="@style/Theme.AppCompat.Li
我有一个媒体播放器,它会在用户关闭应用程序时停止播放,方法是按下主页按钮、使用后退按钮或只是打开另一个应用程序。为获得此行为,我向我的主要 Activity 添加了一个 onStop(),它告诉我的
我发现我的 Activity onStop() 方法将在不到 10 秒的延迟后被调用。我以前从未见过这种行为。 Note :- The activity is singleTop and it sta
我在类似的时钟应用程序中使用了这个示例代码: http://about-android.blogspot.in/2010/04/create-apps-to-show-digital-time-in_
目前,我将平板电脑连接到其他设备(通过蓝牙)。连接成功,但如果 Activity 暂停并停止,例如按下主屏幕时,它肯定会断开连接。我总是可以在 OnStop() 或其他东西中重新连接,但我想在整个过程
为什么程序在“String temp_str = string_array[1]”处崩溃?Logcat:java.lang.NullPointerException:尝试读取空数组。 public c
我终于完成了应用程序中的所有内容,但现在每当我使用除“主页”按钮之外的任何操作退出它时,它都会闪烁强制关闭屏幕,然后它就会消失。我知道这没什么大不了的,但我真的希望这种情况停止发生,我终于得到了一个
我使用 Azure 云辅助角色来处理来自队列的传入任务。每个任务的处理最多可能需要几个小时,每个工作角色最多可以同时处理 N 个任务。基本上,它正在工作。 现在,您可以阅读documentation有
在我的简单 android 应用程序中,我有 2 个 activities。在第一个 activity(主要 Activity )中,我覆盖了 ON STOP 方法。但是当我去做第二个 activit
如果我有一个名为 onStop 的方法,它会调用 super.onStop();。这个方法什么时候运行? 在我的主要 Activity 中,我启动了另一个 Activity ,如下所示:startAc
在我的主要 Activity 中,在 onStop 下,我设置了 myVar = true。在 onResume 中,我检查 myVar = true 并执行某些操作。 如果您在我的主要 Activi
我有一个 Activity,我想在不调用 onDestroy() 的情况下关闭它。所以我使用 onStop(); 看起来像 @Override public void onStop(){
我是一名优秀的程序员,十分优秀!