我有一个应用程序,允许用户安排医疗报警。例如,用户可以安排警报,提醒他们在星期一,星期三和星期五早上8点服用泰诺。
此应用程序还有一个Web部分,用户可以在其中签入并添加/编辑处理。我需要做的是每次触发警报时,我都需要检查API以确保治疗仍然有效,因为在计划和触发警报之间,用户可以通过Web应用程序删除该处理。
在我的代码中,我有一个警报接收器类。在该类的onReceive方法中,我有类似的东西。
@Override
public void onReceive(Context context, Intent intent) {
API.entries(Calendar.getInstance().getTime(), new API.OnApiResponse<JSONObject>() {
@Override
public void onFailure(API.API_Error error) {
new DefaultErrors(mContext, error);
}
@Override
public void onSuccess(JSONObject result) {
mResult = result
}
}
}
显然onSuccess和onFailure都是回调。发生的事情是这些永远不会激发,当我进一步检查mResult时,它是空的。所以我的问题是,由于接收器应该是相当轻的重量,有什么东西可以阻止它回电吗?有什么东西会阻止接收器中的网络通信吗?这个确切的代码正在应用程序中的其他几个地方,但通过活动。
是否有更好的模式来访问API或在接收器中进行网络呼叫?
答案 0 :(得分:3)
只要BroadcastReceiver
方法执行完毕,onReceive()
的生命周期就会结束。这意味着在回调最终发生时,您的OnApiResponse
对象可能已经很久了。 mResult
方法中的onReceive()
对象进一步为空,因为回调尚未发生,可能是由于API.entries()
方法中的网络操作异步执行。
您需要在回调发生时仍然处于活动状态的组件中实现该接口。如果您在广播收据上开始Activity
,则可以在那里实施。如果没有,另一个选项是创建一个Service
,可以从接收器启动以执行API.entries()
呼叫并等待回叫,之后您可以停止Service
。
答案 1 :(得分:0)
理想情况下,您应该使用AsyncTask或IntentService,而不是普通服务,而不是在Activity中。这两个都可以工作,但代码在主应用程序线程中运行,如果Web服务很慢,可能会导致ANR。
IntentService几乎与标准服务一样容易创建,维护自己的线程来处理请求并避免ANR,并且只要它没有更多的意图就可以自动关闭。