Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/199.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
Android 使用BroadcastReceiver更改连接时出现奇怪的错误_Android_Broadcastreceiver_Android Volley - Fatal编程技术网

Android 使用BroadcastReceiver更改连接时出现奇怪的错误

Android 使用BroadcastReceiver更改连接时出现奇怪的错误,android,broadcastreceiver,android-volley,Android,Broadcastreceiver,Android Volley,我在我的一个应用程序中实现了截击库!我有一个数据加载按钮,当我点击它时,它会检查时间戳,然后相应地下载数据,如果有新的数据,或者通知用户他已经有了可用的最新数据 虽然我还想实现一个连接更改接收器,以便在应用程序启动时下载或更新数据。在达到StringRequest的时间戳值之前,一切都会正常进行 在这一点上,一些非常奇怪的事情发生了。尽管请求返回正确的时间戳,但代码首先执行时间戳的get方法,然后执行set方法,该方法使时间戳变量为null。只有当广播接收器触发数据检查时,才会发生这种情况 当手

我在我的一个应用程序中实现了截击库!我有一个数据加载按钮,当我点击它时,它会检查时间戳,然后相应地下载数据,如果有新的数据,或者通知用户他已经有了可用的最新数据

虽然我还想实现一个连接更改接收器,以便在应用程序启动时下载或更新数据。在达到StringRequest的时间戳值之前,一切都会正常进行

在这一点上,一些非常奇怪的事情发生了。尽管请求返回正确的时间戳,但代码首先执行时间戳的get方法,然后执行set方法,该方法使时间戳变量为null。只有当广播接收器触发数据检查时,才会发生这种情况

当手动触发时,一切正常

检查时间戳方法

private void checkTimestamp(){
    mTimestampRequest = new StringRequest(DatabaseSharer.TIMESTAMP_URL,
            new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    Log.d(Menu.class.getSimpleName(), "Responsed back -- " + response);
                    setmTimeStamp(response);
                }
            },new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                }
            }
    );
    mRequestQueue.add(mTimestampRequest);
}
Receiver Logcat(查看get是否为null并在集合之前执行)

手动触发时的Logcat(get也在之前执行,但响应正确)

我没有主意了,所以如果有人能帮助我,我将不胜感激

接收机生命周期 BroadcastReceiver对象仅在onReceive调用期间有效(上下文、意图)。一旦代码从此函数返回,系统将认为对象已完成且不再处于活动状态

这对onReceive(Context,Intent)实现中的操作有重要影响:任何需要异步操作的操作都不可用,因为您需要从函数返回来处理异步操作,但此时BroadcastReceiver不再处于活动状态,因此系统可以在异步操作完成之前终止其进程


特别是,您可能无法从BroadcastReceiver中显示对话框或绑定到服务。对于前者,您应该改用NotificationManager API。对于后者,可以使用Context.startService()向服务发送命令

你能解释一下吗?我刚刚编辑了我的答案。你可以看看。我从android开发者网站上选的。是的。谢谢你,我也看到了。唯一的办法就是启动一个服务来处理这个任务?或者还有其他解决方法吗?asynctask应该在接收方的onReceive方法中注册,或者只从onReceive方法调用它?Ⅹκmate!非常感谢你的帮助!
        checkTimestamp();
        Log.d(Menu.class.getSimpleName(),"dataStaff-1st else entered");
        String lastTimestamp = shared.getString("time", "none");
        final String temp = getmTimeStamp();
        Log.d(Menu.class.getSimpleName(), "temp= " + temp + " -- lasttimestamp = " + lastTimestamp);