【问题标题】:Call AsyncTask methods from another class/service (callbacks?)从另一个类/服务调用 AsyncTask 方法(回调?)
【发布时间】:2010-06-01 07:30:20
【问题描述】:

我想知道是否可以从另一个类和/或服务调用 AsynTask 类中定义的特定方法? 在我的具体情况下,我有一个服务正在播放一些声音,但声音是从具有可用声音的列表中选择的......

选择声音后,它会从我的家庭服务器下载,这需要一些时间(不多,比如说大约 3-4 秒,声音/效果的大小并不大)... 所以我现在的问题是我有一个播放这些声音的服务,当我选择一个时,我想显示一个进度对话框......方式(如果我理解正确的话)是使用 AsyncTask,但唯一的事情是AsyncTask 会告诉我的服务从我的服务器播放特定的声音......所以没有从服务到 Asynctask 的“回调”......

我怎样才能做到这一点? 我如何调用位于另一个类中的正在运行的 AsyncTask,并告诉他所有工作都已完成,因此他可以停止显示 ProgressDialog ? 还是我过度设计它并且还有其他方法? 提前谢谢...

【问题讨论】:

    标签: android callback android-asynctask


    【解决方案1】:

    我会为每次下载使用一个 asyncTask。下载工作在 doInBackground 方法中完成。您可以重写 onPostExecute 方法来完成下载声音后应该完成的所有工作。在您的情况下,我认为这将隐藏进度对话框并告诉播放服务有新音乐可用。

    有关 AsyncTask 的更多信息,请查看 android documentation

    【讨论】:

    • 只是想知道,服务是一个孤独的线程吗?所以我会启动一个 AsyncTask(这也是一个线程),这个应该与我的服务通信,它可以开始播放,当我的服务的 MediaPlayer 达到准备状态时,它应该告诉我的 AsyncTask,这样它就可以停止显示 ProgressDialog。 .. 这就是我想要实现的,所以现在他的问题是:我的服务可以向已经运行的 AsyncTask 发送命令/更新吗?
    • 为什么要告诉异步任务一些事情?任务应该告诉服务一些事情。
    • @TiGer:不。服务不在自己的线程中运行。服务中长时间运行的进程将锁定 UI。
    【解决方案2】:

    其实,我认为你想要的恰恰相反。 AsyncTask 应该用于执行长时间运行的进程,而不是显示进度对话框。事实上,您不应该使用任务的后台进程来访问 UI 的任何部分。所以你要做的是显示一个对话框,启动你的任务,然后让任务在其onPostExecute 方法中关闭对话框,该方法可以操作 UI 组件。

    【讨论】:

    • 对于我长期运行的进程,我有一个服务......现在我必须能够告诉 AsyncTask 我的服务已经准备好做它应该做的......
    • @TiGer:Asynctask 用于执行长时间运行的后台工作。如果这是在其他地方完成的,则不需要 AsyncTask。 ProgressDialog 是一个 UI 组件。如果您想从另一个不是 AsyncTask 的线程与 UI 线程进行通信,请使用处理程序。
    • 好的,让您了解我在视觉上想要实现的目标:用户从列表中选择一个声音,然后应该显示 ProgressDialog(或类似的东西),同时我的声音播放服务从我的服务器流式传输声音,这可能需要一些时间,当它完成并且 MediaPlayer 准备就绪时,它可以开始播放并且应该简单地删除 ProgressDialog...
    • @TiGer:您可以为 MediaPlayer 注册一个 onPreparedListener,当它被调用时,从那里关闭您的 progressDialog。小心从 UI 线程执行此操作。
    • hhmmm 好的......好吧,MediaPlayer 位于服务内,那么我该如何从 UI 线程执行此操作?我如何保持对在“调用”类中启动的 ProgressDialog 的引用?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 2018-05-29
    • 2021-07-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多