Простая функция sendMessageDelayed в Android - PullRequest
3 голосов
/ 08 февраля 2012

Я работаю над созданием метронома, который замедляется во время работы, и мне нужна помощь с функцией sendMessageDelayed.

Во-первых, я попробовал Thread.sleep (), но он был слишком медленным. Позже я прочел там, что он «не возвращается, пока не истечет хотя бы указанное количество миллисекунд».

Затем я прочитал / попытался использовать операторы if с SystemClock.elapsedRealtime (), такие как:

long nextbeep = SystemClock.elapsedRealtime() + waitms;

while(nextbeep > SystemClock.elapsedRealtime()){
    //wait
}//end while

mpbeep.start();

, но это заставляло процессор работать слишком сильно, и гудок был неравномерным.

Редактировать: это то, что у меня сработало:

        bstart.setOnClickListener(new View.OnClickListener() {

        public void onClick(View v) {
            // TODO Auto-generated method stub
            textviewone.setText("start");

            beepandwait();

        }// void onClick

    });// end b start listener

    public void beepandwait() {

    mSoundManager.playSound(soundnumber); //beep

    mHandler.sendMessageDelayed(mHandler.obtainMessage(1), currentms); //wait

}//end beep and wait

private Handler mHandler = new Handler() {
    public void handleMessage(Message m) {

        beepandwait(); //and repeat

    }//end handleMessage

};//Handler

Вот как можно издавать звуки, не отставая от системы:

package com.bgryderclock.example;

import java.util.HashMap;
import android.content.Context;
import android.media.AudioManager;
import android.media.SoundPool;

public class SoundManager {

private  SoundPool mSoundPool; 
private  HashMap<Integer, Integer> mSoundPoolMap; 
private  AudioManager  mAudioManager;
private  Context mContext;

public SoundManager()
{

}

public void initSounds(Context theContext) { 
     mContext = theContext;
     mSoundPool = new SoundPool(4, AudioManager.STREAM_MUSIC, 0); 
     mSoundPoolMap = new HashMap<Integer, Integer>(); 
     mAudioManager = (AudioManager)mContext.getSystemService(Context.AUDIO_SERVICE);         
} 

public void addSound(int Index,int SoundID)
{
    mSoundPoolMap.put(Index, mSoundPool.load(mContext, SoundID, 1));
}

public void playSound(int index) { 
     int streamVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC); 
     mSoundPool.play(mSoundPoolMap.get(index), streamVolume, streamVolume, 1, 0, 1f); 
}

public void playLoopedSound(int index) { 
     int streamVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC); 
     mSoundPool.play(mSoundPoolMap.get(index), streamVolume, streamVolume, 1, -1, 1f); 
}

}
...