使用BroadcastReceiver进行连接更改时的奇怪错误

时间:2013-08-13 23:34:06

标签: android broadcastreceiver android-volley

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

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

此时出现了一些非常奇怪的事情。尽管Request会以正确的时间戳回复,但代码首先执行时间戳的get方法,然后执行使timestamp变量为null的set方法。只有在BroadcastReceiver触发数据检查时才会发生这种情况。

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

CheckTimestamp方法

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并在设置之前执行) enter image description here

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

我没有想法,所以如果有人能帮助我,我会很感激!!

1 个答案:

答案 0 :(得分:1)

接收器生命周期

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

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

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