Android报警接收器onReceive网络请求

时间:2015-12-15 23:26:50

标签: java android

我有一个应用程序,允许用户安排医疗报警。例如,用户可以安排警报,提醒他们在星期一,星期三和星期五早上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或在接收器中进行网络呼叫?

2 个答案:

答案 0 :(得分:3)

只要BroadcastReceiver方法执行完毕,onReceive()的生命周期就会结束。这意味着在回调最终发生时,您的OnApiResponse对象可能已经很久了。 mResult方法中的onReceive()对象进一步为空,因为回调尚未发生,可能是由于API.entries()方法中的网络操作异步执行。

您需要在回调发生时仍然处于活动状态的组件中实现该接口。如果您在广播收据上开始Activity,则可以在那里实施。如果没有,另一个选项是创建一个Service,可以从接收器启动以执行API.entries()呼叫并等待回叫,之后您可以停止Service

答案 1 :(得分:0)

理想情况下,您应该使用AsyncTask或IntentService,而不是普通服务,而不是在Activity中。这两个都可以工作,但代码在主应用程序线程中运行,如果Web服务很慢,可能会导致ANR。

IntentService几乎与标准服务一样容易创建,维护自己的线程来处理请求并避免ANR,并且只要它没有更多的意图就可以自动关闭。