我有一个播放音频的应用。在一个单独的线程中,我在向用户显示进度对话框时调用我的服务。 Service
将启动音频或在10秒左右的时间内出错。我现在拥有的hacky方式是,当Service
确定音频已准备就绪或准备好或出现错误时,它会将本地广播消息发送回我的Activity
并使用该信息。这表示我的主要活动是服务已完成加载和准备媒体,我可以关闭进度对话框等。
现在我让MainActivity
只在do while
循环中等待,显示一个进度对话框,检查一个变量,直到它收到来自改变所述变量的服务的广播
我知道可能不是正确的方法,所以我的问题是,这样做的正确方法是什么?感谢。
答案 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.