У меня есть проблема с Android AsyncTask. Во фрагменте я использую асинхронную задачу для потоковой передачи аудио с URL.Сначала кнопка воспроизведения запускается без каких-либо проблем, но когда я нажимаю, чтобы перейти к следующей песне, пользовательский интерфейс пропускает песню, когда я нажимаю снова в следующей кнопке, тогда она работает нормально.Это значит, что мне нужно щелкнуть два раза, чтобы выполнить следующую функцию кнопки. Вот мой класс асинхронных задач:
private class LodingToFetchMp3Url extends AsyncTask<Void, Integer, String> {
@Override
protected void onPreExecute() {
super.onPreExecute();
pDialog = new ProgressDialog(getActivity());
pDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
pDialog.setMessage("Loading...!");
pDialog.setCancelable(false);
pDialog.show();
}
@Override
protected void onProgressUpdate(Integer... progress) {
}
@Override
protected String doInBackground(Void... params) {
try {
mediaPlayer.setDataSource(Constants.musicArrayListConstants.get(position).getMp3FileUrl());
mediaPlayer.prepare(); // you must call this method after setup the datasource in setDataSource method. After calling prepare() the instance of MediaPlayer starts load data from URL to internal buffer.
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return "";
}
@Override
protected void onPostExecute(String result) {
pDialog.dismiss();
mediaFileLengthInMilliseconds = mediaPlayer.getDuration(); // gets the song length in milliseconds from URL
if (!mediaPlayer.isPlaying()) {
mediaPlayer.start();
imgPlayPause.setBackgroundResource(R.mipmap.btn_pause_black);
} else {
mediaPlayer.pause();
imgPlayPause.setBackgroundResource(R.mipmap.btn_play);
}
primarySeekBarProgressUpdater();
super.onPostExecute(result);
}
}
primarySeekBarProgressUpdater ();Метод:
private void primarySeekBarProgressUpdater() {
seekBarProgress.setProgress((int) (((float) mediaPlayer.getCurrentPosition() / mediaFileLengthInMilliseconds) * 100)); // This math construction give a percentage of "was playing"/"song length"
if (mediaPlayer.isPlaying()) {
Runnable notification = new Runnable() {
public void run() {
primarySeekBarProgressUpdater();
}
};
handler.postDelayed(notification, 100);
}
}
Следующая кнопка onClick:
else if (v.getId() == R.id.imgNext) {
if(Constants.dropsModelArrayListConstants.size() > position) {
position = position + 1;
mediaPlayer.pause();
mediaPlayer = new MediaPlayer();
lodingToFetchMp3Url.cancel(true);
lodingToFetchMp3Url = new LodingToFetchMp3Url();
lodingToFetchMp3Url.execute();
}
}