【发布时间】:2016-03-30 19:11:21
【问题描述】:
我正在尝试实现一种方法,我的应用程序将通过更新 mongodb 数据库来跟踪用户何时打开或关闭我的应用程序。 我知道当一个活动开始时,onCreate() 或 onResume() 方法总是在启动,而当一个活动正在关闭时,onPause() 或 onStop() 方法正在调用。
到目前为止,我尝试过的是:在我的应用程序的每个活动中,我都在调用这个 AsyncTask:
public void updateOnline(String fbid, boolean login){
new updateOnlineAsync(fbid, login).execute();
}
public class updateOnlineAsync extends AsyncTask<Void, Void, Void>{
String fbid;
boolean login;
public updateOnlineAsync(String fbid, boolean login){
this.fbid=fbid;
this.login=login;
}
@Override
protected Void doInBackground(Void... params) {
BasicDBObject query = new BasicDBObject();
query.put("fbid", this.fbid);
Document myDoc = fb_users.find(query).first();
if(login){
Log.d("...", "x");
Document listItem = new Document("online", "0");
Document updateQuery = new Document("$set", listItem);
fb_users.updateOne(myDoc, updateQuery);
}else{
Log.d("...", "y");
Document listItem = new Document("online", "1");
Document updateQuery = new Document("$set", listItem);
fb_users.updateOne(myDoc, updateQuery);
}
return null;
}
}
关于我使用的 onCreate()、onResume() 方法:
ServerRequest serverRequest = new ServerRequest(this);
Profile profile = Profile.getCurrentProfile();
serverRequest.updateOnline(profile.getId(), false);
我使用的 onPause()、onStop() 方法:
ServerRequest serverRequest = new ServerRequest(this);
Profile profile = Profile.getCurrentProfile();
serverRequest.updateOnline(profile.getId(), true);
我认为这应该可行,并根据用户在线/离线情况更新我的文档,但事实并非如此。我想知道这是否是因为 AsyncTask 在应用程序处于后台时无法正常工作,或者我做错了什么。无论如何,任何帮助都非常感谢。
编辑
AsyncTask 中的 Log.d() 点 y 而不是 x。 AsyncTask 正在执行 onCreate() 方法,但不是 onStop()
我刚刚通过更改应用中的活动进行了测试。当我更改应用程序中的活动或按下智能手机的中间按钮(将其发送到后台)时,我的数据库中的在线字段会更新。只有当我完全关闭它时,该方法才有效
【问题讨论】:
-
没有看到
BasicDBObject是什么,这可能是个问题。但是,如果您的日志点击了“y”块而不是“x”,那么您确定要调用updateOnline()并使用真正的登录值开始吗?您是否调试过应用程序并逐行执行代码?每个步骤的变量值是否符合您的预期? -
我刚刚通过更改应用程序中的活动进行了测试。当我更改应用程序中的活动或按下智能手机的中间按钮(将其发送到后台)时,我的数据库中的在线字段会更新。只有当我完全关闭它时,该方法才有效
标签: android mongodb android-asynctask android-lifecycle activity-lifecycle