如何为给定的代码实现Runnable?

时间:2018-01-26 12:15:59

标签: java android handler runnable

我正试图点按一下按钮播放声音。 最初声音是在敲击时播放的,但在反复敲击按钮后,声音不再播放。 所有必需的文件都放在相应的文件夹中。

<GridLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent">

    <Button
        android:id="@+id/one"
        android:layout_width="wrap_content"
        android:layout_height="80dp"
        android:layout_column="0"
        android:layout_columnWeight="1"
        android:layout_row="0"
        android:layout_rowWeight="1"
        android:background="@drawable/one"
        android:onClick="tapped"
        android:tag="0"
        android:text="@string/one"
        tools:text="@string/one" />

    <Button
        android:id="@+id/two"
        android:layout_width="wrap_content"
        android:layout_height="80dp"
        android:layout_column="1"
        android:layout_columnWeight="1"
        android:layout_row="0"
        android:layout_rowWeight="1"
        android:background="@drawable/two"
        android:onClick="tapped"
        android:tag="1"
        android:text="@string/two"
        tools:text="@string/two" />

        </GridLayout>

这是我现在所做的,

public class MainActivity extends AppCompatActivity {

 int myMusic[] = {R.raw.one,R.raw.two};

 @Override
 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
 }


 public void tapped ( final View view){
        Button buttonVar = (Button) view;
        int tagNo;
        tagNo = Integer.parseInt(buttonVar.getTag().toString());
        MediaPlayer sound = MediaPlayer.create(this, myMusic[tagNo]);
        sound.start();

2 个答案:

答案 0 :(得分:2)

完成后,

发布您的媒体播放器。 您正在创建多个媒体播放器实例并导致问题。

使用 -

    sound.release();

答案 1 :(得分:0)

除了sourabh的答案(发布使用过的MediaPlayer),要正确实现多线程(如问题所示),您需要将一个runnable提交到ThreadPool中。

Google / Android提供了下面链接的ExecutorService文档,您可以按照这些文档了解如何在新线程上运行代码块。

请注意,因为在运行异步时,您仍然可以重复播放(除非未处理),因为将启动多个音频源(每个提交的线程一个)。

https://developer.android.com/reference/java/util/concurrent/ExecutorService.html