라디오가 실행될 때까지 항상 progressBar가 표시되어야하므로 toggleButton을 포함하는 라디오 애플리케이션을 만들고 싶습니다.doInBackground()가 API 23에서 완료되기 전에 onPostExecute()가 실행됩니다.
doInBackground()가 끝날 때까지 ProgressBar를 표시하려고합니다. 내 코드는 모든 안드로이드 버전에서 잘 작동합니다. android api 23 (android marshmallow 6.0). onPostExecute()는 doInBackground()보다 먼저 실행됩니다. 나는 이것이 calssic 문제 "업데이트 UI 구성 요소를 사용하여 UI 스레드"이라고 생각
ToggleButton MusicButton;
MediaPlayer mediaPlayer;
String stream = "RADIO_URL";
boolean prepared = false;
boolean started = false ;
public static final String PREFS_NAME = "MyPrefsFile1";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mediaPlayer = new MediaPlayer();
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
AudioAttributes attribs = new AudioAttributes.Builder().setUsage(AudioAttributes.USAGE_MEDIA).setContentType(AudioAttributes.CONTENT_TYPE_MUSIC).build();
mediaPlayer.setAudioAttributes(attribs);
}else {
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
}
new PlayerTask().execute(stream);
/****/
MusicButton = (ToggleButton) findViewById(R.id.toggleButton);
MusicButton.setVisibility(View.INVISIBLE);
MusicButton.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (started && MusicButton.isChecked()) {
started=false;
mediaPlayer.pause();
MusicButton.setChecked(true);
} else {
started=true;
mediaPlayer.start();
MusicButton.setChecked(false);
}
}
});
class PlayerTask extends AsyncTask<String,Void,Boolean> {
ProgressBar radio = (ProgressBar)findViewById(R.id.radioloading);
@Override
protected void onPreExecute() {
super.onPreExecute();
radio.setVisibility(View.VISIBLE);
}
@Override
protected Boolean doInBackground(String... strings) {
try {
mediaPlayer.setDataSource(strings[0]);
mediaPlayer.prepare();
prepared=true;
} catch (IOException e) {
e.printStackTrace();
}
return prepared;
}
@Override
protected void onPostExecute(Boolean aBoolean) {
super.onPostExecute(aBoolean);
MusicButton.setVisibility(View.VISIBLE);
MusicButton.setChecked(true);
radio.setVisibility(View.GONE);
}
}
doInBackground 전에 onPostExecute가 호출된다고 생각하게 만드는 이유는 무엇입니까? – greenapps
@greenapps progressBar에 표시되지 않은 app을 실행하면 radio.setVisibility (View.GONE) 행이 먼저 실행됩니다! –
나는 당신이 진도 표시 줄을 전혀 보지 못한다고 믿을 것이다. 하지만 나는 setvisiblility가 먼저 실행되는 것을 믿지 않는다. 당신은 더 나은 주장을해야합니다. 왜 당신은 진도 표시 줄을 보았습니까? doInBackground의 세 문장은 빠르게 실행되므로 바가 표시되지 않습니다. 꽤 정상입니다. doInBackground가 얼마나 오래 실행되는지에 대해 당신이 기대하는 것이 궁금합니다. – greenapps