2013-04-17 2 views
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; 
    } 
} 

나는 5 초 3의 6 사운드를 재생하기 위해 노력하고있어, 나는 대한의 모든 루프에서 textView1을 업데이트 할 {} , textView1은 "Sonido 5"로만 업데이트됩니다. 제안 사항이 있으십니까?

+0

매우 짧은 길이의 사운드를 재생할 때 텍스트 뷰가 매우 빨리 업데이트 될 수 있다고 생각합니다. 0에서 4까지의 텍스트 뷰의 이전 업데이트를 볼 수 있습니다. 모든 사운드를 재생할 수 있습니까? – Kameswari

답변

0

adelante는 UI 스레드를 차단합니다. 모든 작업이 완료 될 때까지 UI가 업데이트되지 않습니다. 따라서 최종 결과 만 볼 수 있습니다. 핸들러와 스레드를 사용하여 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); 
    } 
} 
+0

해결 된 Ger Soto. – josemfr

0
for (int i=0; i<6; i++) 

당신이 1-6 가고 싶은 경우에 당신은 5 0에서거야, 당신은

+0

문제의 근원이 아닙니다. –

0

tv.setText("Sonido " + (i+1));onCreate()에서이 작업을 수행하지 마십시오 할 필요가있다. 활동을 설정하려면 최소한 onCreate()을 사용해야합니다.

이 경우 UI는 아직 구축되지 않았으므로 최종적으로 onCreate()이 반환되고 UI를 작성하도록 허용 한 모든 업데이트에는 마지막 업데이트 만 표시됩니다.

onResume() 이상을 사용하십시오.

0

첫째, 음악의 끝을 기다리는하기 위해 할 일 {} 동안() 루프를 사용하는 것은 매우 위험하다 아무것도, 그래서, 당신은 그것에 대해 비동기 방식으로 생각해야합니다.

"onPreExecute()"에서 TextView를 새로 고칠 수 있고 완료되면 asynctask에서 발사하는 AsyncTask (Android 프로그래밍에서 반드시!)로 플레이어를 관리하는 것이 좋습니다. 새로운 연극.

또 다른 옵션은 재생 종료를 기다리는 "수신기"를 사용하는 것입니다.

0

아무 때 나 사용할 수 있습니다 ,,,,하지만 시간에 관한 것입니다. 즉, 몇 초 동안 소리를 내고 싶다면 for 루프는 가장 최근에 업데이트 된 값을 가져옵니다. ... 그래서 업데이트 된 값을 얻기 위해 Handler()를 사용해야합니다. 매 초마다 각 값 ..... 왜 for 루프에서 i의 가장 최근 값을 얻고 있는지

관련 문제