Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 安卓警报接收器接收网络请求_Java_Android - Fatal编程技术网

Java 安卓警报接收器接收网络请求

Java 安卓警报接收器接收网络请求,java,android,Java,Android,我有一个应用程序,允许用户安排医疗报警。例如,用户可以安排闹钟提醒他们在周一、周三和周五早上8点服用泰诺 该应用程序还有一个web部分,用户可以在其中签入和添加/编辑治疗。我需要做的是,每次触发警报时,我都需要检查API以确保治疗仍然有效,因为在计划和触发警报之间,用户可能已经通过web应用程序删除了该治疗 在我的代码中,我有一个报警接收器类。在该类的onReceive方法中,我有类似的内容 @Override public void onReceive(Context context, Int

我有一个应用程序,允许用户安排医疗报警。例如,用户可以安排闹钟提醒他们在周一、周三和周五早上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
        }
    }
}
@覆盖
public void onReceive(上下文、意图){
条目(Calendar.getInstance().getTime(),新的API.OnApiResponse(){
@凌驾
public void onFailure(API.API_错误){
新的DefaultErrors(mContext,error);
}
@凌驾
成功时公共无效(JSONObject结果){
mResult=结果
}
}
}
很明显,onSuccess和onFailure都是回调。发生的事情是这些都不会触发,当我进一步检查mResult时,它是空的。所以我的问题是,既然一个接收器应该很轻,有什么东西可以阻止它回调吗?有什么东西可以阻止接收器中的网络通信吗?这正是代码在应用程序中的其他几个位置工作,但通过活动


在接收器中访问API或进行网络调用是否有更好的模式?

a
BroadcastReceiver
的生命周期几乎在
onReceive()之后结束
方法已执行完毕。这意味着您的
OnApirResponse
对象在回调最终发生时可能早已死亡。
mResult
对象在
onReceive()中进一步为空
方法,因为回调尚未发生,可能是由于
API.entries()方法中的网络操作异步执行所致


您需要在回调发生时仍处于活动状态的组件中实现接口。如果您在广播接收时启动
活动
,则可以在该组件中实现该接口。否则,另一个选项是创建可从接收器启动的
服务
,以执行
API.entries()
调用并等待回调,然后您可以停止
服务

理想情况下,您应该使用AsyncTask或IntentService,而不是正常的服务,并且不在活动中。这两者都可以工作,但那里的代码在主应用程序线程中运行,如果web服务速度慢,可能会导致ANR


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

如果我实现了服务方法,那么继续检查api、构建警报和管理其他服务是否也是一个好的设计里面也有东西吗?基本上是把服务作为一个助手来做所有在接收器的短生命周期内不应该发生的事情?它肯定可以在那里做,我几乎编辑了我的答案来这么说。不过,从你的问题中我可以看出,你的知识足够丰富,可以看到这些,所以我不介意。Ult依我看,这取决于你自己,以及你希望如何处理设计中的关注点分离和给定的目标。FWIW,这基本上就是我要做的;尽可能远离接收器,任何需要异步或幕后发生的事情都将在服务中处理。你打算如何处理异步s在AsyncTask或IntentService中的回调,因为这两个类在其主要方法执行完毕后不久就会停止自己的调用?如果不了解此API类的实际工作方式,我无法对此给出具体的答案,但在我自己的应用程序中,我使用AsyncTasks和IntentService的阻塞调用。例如,HttpURLConnection。如果网络事务已经在异步进行,它不会阻止服务或活动。我想如果他们想重写网络操作(如果需要的话),最终取决于操作。