2017-10-28 3 views
0

라디오가 실행될 때까지 항상 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); 
     } 
    } 
+0

doInBackground 전에 onPostExecute가 호출된다고 생각하게 만드는 이유는 무엇입니까? – greenapps

+0

@greenapps progressBar에 표시되지 않은 app을 실행하면 radio.setVisibility (View.GONE) 행이 먼저 실행됩니다! –

+1

나는 당신이 진도 표시 줄을 전혀 보지 못한다고 믿을 것이다. 하지만 나는 setvisiblility가 먼저 실행되는 것을 믿지 않는다. 당신은 더 나은 주장을해야합니다. 왜 당신은 진도 표시 줄을 보았습니까? doInBackground의 세 문장은 빠르게 실행되므로 바가 표시되지 않습니다. 꽤 정상입니다. doInBackground가 얼마나 오래 실행되는지에 대해 당신이 기대하는 것이 궁금합니다. – greenapps

답변

1

:

MainActivity이 내 코드입니다. 다른 스레드 (AsyncTask의 스레드)에서 가시성을 변경하려고하므로 UI ​​구성 요소의 가시성이 전혀 변경되지 않습니다. AsyncTask의 publishProgress(someProgress) 메서드를 사용하고 AsyncTask에서 onProgressUpdate(aListener) 메서드의 후크를 시도하고 UI 가시성을 업데이트하십시오.

문제가 해결되지 않으면 알려주세요.

관련 문제