0

activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >

<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" />

<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/textView1"
android:layout_marginTop="153dp"
android:layout_toRightOf="@+id/textView1"
android:onClick="adelante"
android:text="Button" />
</RelativeLayout> 

MainActivity.java

package com.example.pruebamusica;

import android.media.MediaPlayer;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.TextView;

public class MainActivity extends Activity {

  MediaPlayer mp[]=new MediaPlayer[6];
  public TextView tv;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    tv = (TextView) findViewById(R.id.textView1);
    for (int i=0; i<6; i++){
      String sonido = "raw/g" + (i+1);
      int resID = getResources().getIdentifier(sonido, null, this.getPackageName());
      mp[i]= MediaPlayer.create(this, resID);
    }
  }

  public void adelante (View v){
    for (int i=0; i<6; i++){
      tv.setText("Sonido " + i);
      mp[i].start();
      do { // ESPERAMOS A QUE EL SONIDO ACABE.
      } while (mp[i].isPlaying());
    }
  }

  @Override
  public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
  }
}  

我正在尝试播放 3 到 5 秒的 6 种声音,我想textView1在 for{} 的每个循环中进行更新,但textView1只更新为“Sonido 5”。有什么建议么?

4

5 回答 5

0

首先,使用 do{}while() 循环等待音乐结束是非常危险的,因为它什么都不做就收获资源,所以,你必须以异步的方式考虑它。

我建议您将播放器作为 AsyncTask(必须!在 Android 编程中)进行管理,其中,在“onPreExecute()”处,您可以刷新电视 TextView,并在完成后退出异步任务,触发新的播放。

另一种选择是使用“监听器”来等待播放结束。

于 2013-04-17T07:22:11.933 回答
0

adelante 将阻塞 UI 线程。在完成所有任务之前,UI 不会更新。所以你只能看到最终的结果。请使用 Handler 和线程来更新 UI。

你应该用 AsyncTask 来做:

MySyncTask extends AsyncTask<Void, Integer, Void> {
      protected Long doInBackground(URL... urls) {
          for (int i=0; i<6; i++){
             publishProgress(i);
             mp[i].start();

             do { // ESPERAMOS A QUE EL SONIDO ACABE.
             } while (mp[i].isPlaying());
         }
    }

    protected void onProgressUpdate(Integer... progress) {
         tv.setText("xxx play:" + i);
     }
}
于 2013-04-17T07:15:40.907 回答
0

您可以使用任何循环 ,,,... 但如果它与时间有关。即你想播放声音几秒钟你的 for 循环将获得最后一个即最近更新的 i 值...所以我想获得每一秒的更新值你必须使用 Handler() 来更新每个每秒值一次......这就是为什么你在 for 循环中获得 i 的最新值

于 2013-09-09T11:34:30.103 回答
0
for (int i=0; i<6; i++)

你从 0 到 5。如果你想去 1-6,你需要做tv.setText("Sonido " + (i+1));

于 2013-04-17T05:59:24.610 回答
0

不要在onCreate(). 您应该只使用onCreate()最少的必要条件来设置活动。

onCreate()在这种情况下,UI 甚至还没有构建,因此当您最终允许返回和构建 UI 的活动时,任何更新都只会显示最后一个。

使用onResume()或以后。

于 2013-04-17T06:13:57.947 回答