0

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

虽然我还想在应用程序启动时实现连接更改的接收器,以便下载数据或更新它们。一切都很好,直到它到达时间戳值的 StringRequest。

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

当它被手动触发时,一切都很好......

检查时间戳方法

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);
}

方法调用顺序

        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);

Receiver Logcat(看到get为null,在set之前执行) 在此处输入图像描述

Logcat手动触发时(get之前也执行过,但响应正确) 在此处输入图像描述

我没有想法,所以如果有人可以帮助我,我将不胜感激!!

4

1 回答 1

1

接收器生命周期

BroadcastReceiver 对象仅在调用 onReceive(Context, Intent) 期间有效。一旦您的代码从此函数返回,系统就会认为该对象已完成且不再处于活动状态。

这对你在 onReceive(Context, Intent) 实现中可以做的事情有重要的影响:任何需要异步操作的东西都不可用,因为你需要从函数返回来处理异步操作,但此时 BroadcastReceiver 是不再活动,因此系统可以在异步操作完成之前自由地终止其进程。

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

于 2013-08-13T23:38:32.827 回答