Вы должны использовать только один объект медиапланера
public class PlayaudioActivity extends Activity {
private MediaPlayer mp;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button b = (Button) findViewById(R.id.button1);
Button b2 = (Button) findViewById(R.id.button2);
final TextView t = (TextView) findViewById(R.id.textView1);
b.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
stopPlaying();
mp = MediaPlayer.create(PlayaudioActivity.this, R.raw.far);
mp.start();
}
});
b2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
stopPlaying();
mp = MediaPlayer.create(PlayaudioActivity.this, R.raw.beet);
mp.start();
}
});
}
private void stopPlaying() {
if (mp != null) {
mp.stop();
mp.release();
mp = null;
}
}
}
Вы можете попытаться использовать countApprox
в RDD API, хотя это также запускает задачу Spark, она должна быть быстрее, поскольку она просто дает вам оценку истинного счета в течение определенного времени, которое вы хотите потратить (миллисекунды) и доверительный интервал (т. е. вероятность того, что истинное значение находится в этом диапазоне):
пример использования:
val cntInterval = df.rdd.countApprox(timeout = 1000L,confidence = 0.90)
val (lowCnt,highCnt) = (cntInterval.initialValue.low, cntInterval.initialValue.high)
Вам нужно немного сыграть с параметрами timeout
и confidence
. Чем выше тайм-аут, тем точнее расчетный счет.
Если у вас действительно огромное количество записей, вы можете получить приблизительный счет, используя что-то вроде HyperLogLog , и это может быть быстрее, чем count()
. Однако вы не сможете получить никакого результата, не отпуская работу.
При использовании Spark существуют два типа операций RDD: преобразования и действия . Грубо говоря, преобразования меняют RDD и возвращают новый RDD. Действия вычисляют или генерируют некоторый результат. Преобразования лениво оцениваются, поэтому они не запускают работу, пока действие не будет вызвано действием в конце последовательности преобразований.
Поскольку Spark является распределенной структурой программирования, для выполнения заданий много накладных расходов. Если вам нужно что-то, что больше похоже на «реальное время», что бы это ни значило, используйте базовую Scala (или Python), если ваши данные достаточно малы или перейдут на потоковый подход и сделайте что-то вроде обновления счетчика по мере прохождения новых записей.
low
иhigh
, результат будет менее точным. – lovasoa 14 June 2017 в 21:57