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中完成之前执行的主要内容,如果未能解决你的问题,请参考以下文章

从片段调用 Android AsyncTask 没有调用其成员 - doInbackground、onpreexecute、onpostexecute

分配的变量引用在哪里,在堆栈中还是在堆中?

NOIP 2015 & SDOI 2016 Round1 & CTSC 2016 & SDOI2016 Round2游记

秋的潇洒在啥?在啥在啥?

上传的数据在云端的怎么查看,保存在啥位置?

在 React 应用程序中在哪里转换数据 - 在 Express 中还是在前端使用 React?