java - 带有媒体播放器的异步任务不会触发 PublishProgress

标签 java android android-asynctask media-player progress

我写了一个AsyncTask:

public class AudioTransition extends AsyncTask <Void, Void, MediaPlayer>
{   
    private int goalID;
    private int milliseconds;
    private MediaPlayer tempPlayer;

    AudioTransition(int ID, int Milliseconds)
    {
        goalID = ID;
        milliseconds = (int)(((float)Milliseconds)/100);
    }

    @Override
    protected void onPreExecute()
    {
       tempPlayer = MediaPlayer.create(context, goalID);
       tempPlayer.setVolume(0, 0);
       tempPlayer.setLooping(true);
       tempPlayer.start();
    }

    @Override
    protected MediaPlayer doInBackground(Void... arg0) {

        for (int i = 0; i < 100; i++)
        {
            value = i;

            publishProgress();
            try {
                Thread.sleep(milliseconds);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            if (!player.isPlaying())
                tempPlayer.pause();
        }

        return tempPlayer;
    }

    @Override
    protected void onProgressUpdate(Void... v) {
        super.onProgressUpdate(v);
        player.setVolume(100-value, 100-value);
        tempPlayer.setVolume(value, value);
    }


    @Override
    protected void onPostExecute( MediaPlayer result )  {
          super.onPostExecute(result);
          player.reset();
          player = tempPlayer;
          player.setVolume(100,100);
          transitioning = false;
    }
}

但是音量并没有消失。它只是启动两条轨道,然后停止。在 doInBackground 完成之前,MediaPlayers 不会更新。 如何使 MediaPlayers 在这种类型的后台工作人员中得到更新? 看起来publishProgress() 应该可以工作。

最佳答案

天哪。不要在 AsyncTask 中 hibernate 线程!您完全滥用了 AsyncTask。你想不出另一种方法来完成计时器类型的事情,所以你捕获了 AsyncTask 的publishprogress的想法(它甚至不像我认为你认为的那样工作),尽管 AsyncTask 应该用于一个一件事,只有一件事:在主(UI)线程上做繁重的工作。

如果您只是想淡出音量,请使用如下所示的内容:(这位于任何方法之外的某个位置)。

 private Runnable VolumeFadeRunnable = new Runnable() {
        @Override
        public void run() {
                volume--;
             player.setVolume(volume, volume);
                 if(volume>0)
               handler.postDelayed(this, 1000);
                 else
                   handler.removeCallbacks(this);
        }
    };

只需将处理程序初始化为 onCreate 或其他内部的字段,并确保该处理程序和计数器变量在该可运行对象内部可见。

关于java - 带有媒体播放器的异步任务不会触发 PublishProgress,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11638786/

相关文章:

java - Android: onPause() 是否保证在 finish() 之后被调用?

Java servlet,在排队之前收到每个请求后的响应

android - kotlin中如何将Unit转换为String(添加同步代码后UPD不起作用)

android - 运行 AsyncTask 时切换 Activity 会泄漏内存吗?

Android SQLite 查询、插入、更新、删除,总是需要在后台线程?

java - Hamcrest describeMismatchSafely 总是在我的实现中打印 Object.toString()

java - Image byte [] 到 Grails 中的 response.outputStream 导致 "Cannot forward after response has been committed"

android - 如何在 Android 中每 10 分钟运行一次方法?

android - 屏幕开/关的 BroadcastReceiver 不起作用

android - 无法在 AsyncTask 中设置 SharedPreferences?