2013-08-29 2 views
0

я получил этот класс здесь:Play волна файл каждые 500 мс

public class ViewBeat1 extends MasterView { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     try { 
      stream = getAssets().open("some_gif.gif"); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     GifMovieView view = new GifMovieView(this, stream); 

     setContentView(view); 
     run(); 
    } 

    public void run() { 

     // Get the ringtone 

     int milliseconds = 0; 
     final SoundPool sp = new SoundPool(2, AudioManager.STREAM_MUSIC, 0); 
     final int loaded = sp.load(this, R.raw.beat, 1); 

     boolean played = false; 


     while (milliseconds < 300000) { 
      if (milliseconds >= 20000 && !played) { 
       sp.stop(loaded); 
       sp.release(); 
       played = true; 
       playSong(this.getClass().getSimpleName().toLowerCase(), 
         View6.class.getName(), 4000); 
       finish(); 
      } else if (milliseconds <= 20000) { 
       try { 
        sp.play(loaded, 1, 1, 1, 0, 1); 
        Thread.sleep(500); 
        milliseconds += 500; 


       } catch (Exception e) { 
        Log.v("out of the thread", e.getMessage().toString()); 
       } 
      } 
     } 
    } 
} 

MasterView простирается от деятельности и просто делает некоторые вещи, скорее всего, здесь не нужны. GifMovieView устанавливает анимацию gif и помещает ее в Contentview.

Теперь я хочу воспроизвести этот 500-миллиметровый длинный волновой файл каждые 500 мс, вроде как быстрое сердцебиение (120 уд/мин). Как-то, когда я делаю это так, он не работает должным образом, и вид приложения больше не отвечает. У кого-нибудь есть лучшее решение для достижения этого?

Приветствуем вас за помощь - сообщество StackOverflow является лучшим!

+0

Попробуйте использовать свой код в обработчике с 'postDelayed' – kabuto178

+0

Не могла бы вы показать мне, как это будет выглядеть? Потому что я пытался, и он не работал должным образом. – Kazoooka

+0

** onCreate() ** не подходит ** main() ** в однопоточном приложении. Вы не можете просто продолжать исполнение навсегда. Ожидается, что все действия, которые выполняются в основном потоке, будут выполнять свою работу и выйти. Если вы хотите сделать что-то, что требует времени, вам нужно запустить его в отдельном потоке или сделать это с помощью обработчика, как предлагает JuniKim. –

ответ

0

Вы не должны делать это в потоке gui, так как он блокирует почти все. Именно по этой причине ваше приложение больше не отвечает.

Начать новую тему, как этот

public class ViewBeat1 extends MasterView implements Runnable { 
    ... 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     ... 
     // instead of calling run() directly, start in new thread 
     Thread thread = new Thread(this); 
     thread.start(); 
    } 

    public void run() { 
    ... 
    } 
} 
+0

Мой «ViewBeat1» простирается от «MasterView», и это продолжается от «Activity». Эта операция «ViewBeat» вызывается другой деятельностью с помощью Intentn. Некоторые, как я получаю ошибку, когда я использую вашу технику. – Kazoooka

1

Ваше приложение перестает отвечать на запросы, так как вы никогда не вернетесь из OnCreate метод!

Попробуйте создать Handler и разместите его автоматически каждые 500 миллисекунд. Что-то вроде следующего, возможно,

public class ViewBeat1 extends MasterView { 
    private SoundPool mSoundPool; 
    private Handler mHandler; 
    private Runnable mPlaySoundRunnable; 
    private Runnable mFinishRunnable; 
    private int mSoundId; 
    private int mPlayCount; 
    private long mFinishTime; 

    @Override 
    protected void onCreate(final Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 


     try { 
      stream = getAssets().open("some_gif.gif"); 
     } catch (IOException e) { 
      e.printStackTrace(); 
      finish(); 
      return; 
     } 
     setContentView(new GifMovieView(this, stream)); 

     mSoundPool = new SoundPool(2, AudioManager.STREAM_MUSIC, 0); 
     mHandler = new Handler(); 

     mPlaySoundRunnable = new Runnable() { 
      @Override 
      public void run() { 
       mPlayCount++; 
       mSoundPool.play(mSoundId, 1f, 1f, 1, 0, 1f); 

       if (mPlayCount < 40) { 
        mHandler.postDelayed(mPlaySoundRunnable, 500L); 
       } 
      } 
     }; 

     mFinishRunnable = new Runnable() { 
      @Override 
      public void run() { 
       mSoundPool.stop(mSoundId); 
       mSoundPool.release(); 
       playSong(Activity.this.getClass().getSimpleName().toLowerCase(), View6.class.getName(), 4000); 
       finish(); 
      } 
     }; 

     mSoundId = mSoundPool.load(this, R.raw.beat, 1); 
     if (mSoundId > 0) { 
      mHandler.post(mPlaySoundRunnable); 
     } 

     mFinishTime = System.currentTimeMillis() + 30000L; 
     mHandler.postAtTime(mFinishRunnable, mFinishTime); 
    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 
     mHandler.removeCallbacks(mFinishRunnable); 
     mHandler.removeCallbacks(mPlaySoundRunnable); 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     mHandler.postAtTime(mFinishRunnable, mFinishTime); 
     if (mPlayCount < 40) { 
      mHandler.post(mPlaySoundRunnable); 
     } 
    } 
} 
Смежные вопросы