循环等待小后台任务的最佳方法是什么?

时间:2016-10-01 05:53:06

标签: android

我有一个播放音频的应用。在一个单独的线程中,我在向用户显示进度对话框时调用我的服务。 Service将启动音频或在10秒左右的时间内出错。我现在拥有的hacky方式是,当Service确定音频已准备就绪或准备好或出现错误时,它会将本地广播消息发送回我的Activity并使用该信息。这表示我的主要活动是服务已完成加载和准备媒体,我可以关闭进度对话框等。

现在我让MainActivity只在do while循环中等待,显示一个进度对话框,检查一个变量,直到它收到来自改变所述变量的服务的广播

我知道可能不是正确的方法,所以我的问题是,这样做的正确方法是什么?感谢。

1 个答案:

答案 0 :(得分:0)

这种忙碌的等待对于处理这种情况绝对不是一个好主意。您可能会考虑将接口声明为这样。

if(isset($_GET['status']))
   $status =$_GET['status'];

然后,您需要在此if($status != 'failure') { "redirect to success url" } else{ "redirect to failure url" } 中实施public interface MediaResponseListener { void mediaResponseReceiver(String result); }

interface

现在您在MainActivity课程中宣布public class MainActivity extends Activity implements MediaResponseListener { // Your onCreate and other function goes here // Then you need to implement the function of your interface @Override public void mediaResponseReceiver(String result) { // Do something with the result } } ,当您从interface传递Service时,Service的引用。所以你的MainActivity可能看起来像这样。

interface

Service开始public AudioService extends Service { // Declare an interface public MediaResponseListener mMediaResponseListener; // ... Your code // When some error occurs or you want to send some information to the launching Activity mMediaResponseListener.mediaResponseReceiver(result); } 时,您需要将Service的引用传递给Activity。所以在你的interface你需要做这样的事情。

Service

以下是您可以避免忙碌等待的方法,并且可以从MainActivity不时收到回复。

现在,行为可以通过许多其他方式实现,就像您已经尝试过本地广播一样。

那么,为什么不在private AudioService mAudioService; mAudioService. mMediaResponseListener = this; startService(); 中声明Service,当BroadcastReceiver收到任何Activity时会调用Broadcast

Here's a nice implementation of how you can send and receive broadcast.