我在我的一个应用程序中实现了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并在设置之前执行)
Logcat手动触发时(get也在之前执行,但有正确的响应)
我没有想法,所以如果有人能帮助我,我会很感激!!
答案 0 :(得分:1)
BroadcastReceiver对象仅在对onReceive(Context,Intent)的调用期间有效。一旦您的代码从此函数返回,系统将认为该对象已完成且不再处于活动状态。
这对你在onReceive(Context,Intent)实现中可以做的事情有重要的影响:任何需要异步操作的东西都不可用,因为你需要从函数返回来处理异步操作,但是那时候BroadcastReceiver不再处于活动状态,因此系统可以在异步操作完成之前自由终止其进程。
特别是,您可能无法在BroadcastReceiver中显示对话框或绑定到服务。对于前者,您应该使用NotificationManager API。对于后者,您可以使用Context.startService()向服务发送命令。