2017-10-28 2 views
0

トグルボタンを含むラジオアプリケーションを作成したいと思います。常にラジオが実行されるまでprogressBarを表示する必要があります。doInBackground()がAPI23で終了する前にonPostExecute()が実行されます

私はdoInBackground()が終了するまでProgressBarを表示しようとしています。私のコードはすべてのアンドロイドバージョンで正常に動作します。アンドロイドapi 23(android marshmallow 6.0)は、onPostExecute()がdoInBackground()の前に実行されます。これは私のコードです:

MainActivity

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に表示されなかったアプリを実行すると、ラジオの.setVisibility(View.GONE)が最初に実行されます。 –

+1

私はあなたがプログレスバーを全く見ないと信じています。しかし、私は設定可能性が最初に実行されたとは思わない。より良い議論が必要です。なぜプログレスバーが表示されますか? doInBackgroundの3つのステートメントはすばやく実行され、バーは表示されません。かなり正常です。私はあなたがdoInBackgroundがどれくらい長く '実行されるのか'について何を期待しているのだろうか。 – greenapps

答えて

1

私は、これが問題calssic "更新UIコンポーネントの使用UIスレッド" だと思います。他のスレッド(AsyncTaskのスレッド)から可視性を変更しようとしているので、UIコンポーネントの可視性はまったく変更されていません。 AsyncTaskのpublishProgress(someProgress)メソッドを使用して、AsyncTaskのonProgressUpdate(aListener)メソッドからフックし、そこでUIの可視性を更新してみてください。

問題が解決しない場合は教えてください。

関連する問題