onPostExecute()在doInBackground()在API 23中完成之前执行
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了onPostExecute()在doInBackground()在API 23中完成之前执行相关的知识,希望对你有一定的参考价值。
我想创建一个包含toggleButton的无线电应用程序,因为在收音机执行之前应始终显示progressBar。
我正在尝试显示一个ProgressBar,直到doInBackground()完成。我的代码适用于所有android版本execpt android api 23(android marshmallow 6.0),其中onPostExecute()在doInBackground()之前执行。这是我的代码:
主要内容:
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);
}
}
答案
我认为这是calssic“使用UI线程来更新UI组件”的问题。 UI组件的可见性根本没有改变,因为您正试图从另一个线程(AsyncTask的线程)更改可见性。请尝试使用AsyncTask的publishProgress(someProgress)
方法并从AsyncTask中的onProgressUpdate(aListener)
方法挂钩并更新那里的UI可见性。
如果这不能解决问题,请告诉我。
以上是关于onPostExecute()在doInBackground()在API 23中完成之前执行的主要内容,如果未能解决你的问题,请参考以下文章
onPostExecute() 无法重新运行从活动调用的 asyncTask
片段中的 Asynctask 未到达 onPostExecute