Java mediaplayer的Android异步任务通信

Java mediaplayer的Android异步任务通信,java,android,multithreading,android-asynctask,android-mediaplayer,Java,Android,Multithreading,Android Asynctask,Android Mediaplayer,我的任务是下载一些文件并按顺序播放 现在我有一个AsynkTask调用服务器,等待服务器生成文件,然后下载它,我为n个文件执行此操作。 我的活动中有一个最终的ArrayList,由AsyncTask填充,其中包含下载文件的路径 doInBackground中的另一个Asynktask等待(使用Thread.Sleep()的迭代和最大迭代次数),ArrayList的第一个元素被填充,因此它从doInBackground退出,并在postexecute()中使用此文件初始化VideoView并播放,

我的任务是下载一些文件并按顺序播放

现在我有一个AsynkTask调用服务器,等待服务器生成文件,然后下载它,我为n个文件执行此操作。 我的活动中有一个最终的ArrayList,由AsyncTask填充,其中包含下载文件的路径

doInBackground中的另一个Asynktask等待(使用Thread.Sleep()的迭代和最大迭代次数),ArrayList的第一个元素被填充,因此它从doInBackground退出,并在postexecute()中使用此文件初始化VideoView并播放,其他文件在VideoView的OnCompletion方法中播放

现在我知道这不是最好的方式,我正在寻找异步任务之间通信的另一种方式。我知道在一段时间的迭代中使用全局ArrayList和Thread.Sleep()是不好的。 我尝试使用自定义回调函数,但函数代码需要UIThread,因为需要启动VideoView。所以我无法从doinBackground()调用回调


有什么建议吗?

我不认为asynctask是否是适合您情况的最佳选择。缺点之一是,您不能在异步任务中真正等待任何类型的回调(除非进行恶意攻击)

另一个缺点是,默认情况下,asynctasks以串行方式运行,因此不能让一个asynctask等待另一个asynctask的结果(这种行为可以更改,但我不认为这是您想要做的事情)


一个更干净的解决方案是使用HandlerThread,然后在它们之间发送消息。这些线程将处理给定的消息,或运行Runnable,然后等待直到获得下一条消息/Runnable。因此,您可以轻松设置它们之间的通信。

Asynktask可以使用executeOnExecutor(AsyncTask.THREAD\u POOL\u EXECUTOR)以并行模式运行。现在,我在第一次下载后使用runOnUiThread解决了这个问题,所以我删除了while()和Thread.sleep()。但现在我看到了HandlerThreadYes,您可以使用自定义执行器使AsyncTask并行运行,这就是为什么我说“这种行为可以改变”。但总的来说,如果您认为需要多个asyntask相互通信,通常HandlerThread是一个更好的选择。