调试同步 ParseObjects 的 IntentService
Debugging IntentService that syncs ParseObjects
我有一个 android 项目,其后端使用 parse.com。为了减少 api 调用的数量,我一直将 "not so important" 数据固定到本地数据存储,并尝试在每个用户会话中同步一次。我为此使用了 IntentService。我正在调用 IntentService,如下所示。但是当 IntentService 被调用时,我没有看到任何日志消息或调试断点被调用。
问题一:如何调试Intent服务?
问题 2:我想为每个用户会话执行一次服务(每次用户打开和关闭应用程序时)。我不想将代码添加到 activity 的 onPause 方法,因为我的应用程序有多个活动,因此 onPause 在一个会话中被调用多次。因此,我从 activity 的 onBackPressed 调用服务,这是用户退出应用程序之前的最后一个屏幕。这是万无一失的吗?
意图调用代码:
@Override
public void onBackPressed() {
if(exitCount == 1)
{
exitCount=0;
Intent i= new Intent(this, SyncChoiceService.class);
this.startService(i);
super.onBackPressed();
}
else
{
Toast.makeText(getApplicationContext(), "Press Back again to quit.", Toast.LENGTH_SHORT).show();
exitCount++;
}
return;
}
IntentService 代码
public class SyncChoiceService extends IntentService {
/**
* Creates an IntentService. Invoked by your subclass's constructor.
*
* @param name Used to name the worker thread, important only for debugging.
*/
public SyncChoiceService(String name) {
super("SyncChoiceService");
}
@Override
protected void onHandleIntent(Intent intent) {
//android.os.Debug.waitForDebugger();
// Adding this waitForDebugger doesn't make a difference
ParseQuery query = new ParseQuery("PostChoice");
query.fromPin();
query.findInBackground(new FindCallback<ParseObject>() {
@Override
public void done(final List<ParseObject> list, ParseException e) {
if(list!=null)
{
if(!list.isEmpty())
{
ParseObject.saveAllInBackground(list, new SaveCallback() {
@Override
public void done(ParseException e) {
ParseObject.unpinAllInBackground(list, new DeleteCallback() {
@Override
public void done(ParseException e) {
Log.i("Unpinned ","everything");
}
});
}
});
}
}
}
});
}
}
问题一:如何调试Intent服务?
如评论中所述,您应该能够设置断点并将调试器附加到服务。
问题2:我想执行服务...?
这将取决于您的要求以及您希望如何定义会话。
如果会话定义为用户注销时 in/logs 退出,那么您只需将代码简单地放在您的登录/注销逻辑中即可
如果您将会话定义为当您的应用程序处于最前面时 ground/until 它会转到 background/killed,这会变得有点复杂。我会尽量提供info/cases:
启动应用程序比较容易,因此,您可以在启动器 activity 的 onCreate
中启动您的服务,如果您子class它
关闭应用程序取决于您定义的 closing
。如果您要求用户明确退出应用程序,则无需处理以下情况:
用户只需按主页按钮即可将应用程序置于后台,在这种情况下 onBackPressed
将不会被调用,并且系统可能会在后台清理您的应用程序,因此您永远不会得到有机会开始你的服务。在这种情况下,系统将调用 onSaveInstanceState
并为您提供启动服务的机会。 (如果您不关心这种情况,那么您应该没问题)。这里的一个极端情况是 onSavedInstance
状态也会在屏幕旋转时调用,因此您需要一些逻辑来区分应用程序何时进入后台与屏幕旋转
附带一件事:
onHandleIntent
在后台线程上调用,因此您可以只使用 find
save
和 unpin
的同步版本,这将帮助您避免所有嵌套。
希望这对您有所帮助。
我有一个 android 项目,其后端使用 parse.com。为了减少 api 调用的数量,我一直将 "not so important" 数据固定到本地数据存储,并尝试在每个用户会话中同步一次。我为此使用了 IntentService。我正在调用 IntentService,如下所示。但是当 IntentService 被调用时,我没有看到任何日志消息或调试断点被调用。
问题一:如何调试Intent服务?
问题 2:我想为每个用户会话执行一次服务(每次用户打开和关闭应用程序时)。我不想将代码添加到 activity 的 onPause 方法,因为我的应用程序有多个活动,因此 onPause 在一个会话中被调用多次。因此,我从 activity 的 onBackPressed 调用服务,这是用户退出应用程序之前的最后一个屏幕。这是万无一失的吗?
意图调用代码:
@Override
public void onBackPressed() {
if(exitCount == 1)
{
exitCount=0;
Intent i= new Intent(this, SyncChoiceService.class);
this.startService(i);
super.onBackPressed();
}
else
{
Toast.makeText(getApplicationContext(), "Press Back again to quit.", Toast.LENGTH_SHORT).show();
exitCount++;
}
return;
}
IntentService 代码
public class SyncChoiceService extends IntentService {
/**
* Creates an IntentService. Invoked by your subclass's constructor.
*
* @param name Used to name the worker thread, important only for debugging.
*/
public SyncChoiceService(String name) {
super("SyncChoiceService");
}
@Override
protected void onHandleIntent(Intent intent) {
//android.os.Debug.waitForDebugger();
// Adding this waitForDebugger doesn't make a difference
ParseQuery query = new ParseQuery("PostChoice");
query.fromPin();
query.findInBackground(new FindCallback<ParseObject>() {
@Override
public void done(final List<ParseObject> list, ParseException e) {
if(list!=null)
{
if(!list.isEmpty())
{
ParseObject.saveAllInBackground(list, new SaveCallback() {
@Override
public void done(ParseException e) {
ParseObject.unpinAllInBackground(list, new DeleteCallback() {
@Override
public void done(ParseException e) {
Log.i("Unpinned ","everything");
}
});
}
});
}
}
}
});
}
}
问题一:如何调试Intent服务? 如评论中所述,您应该能够设置断点并将调试器附加到服务。
问题2:我想执行服务...? 这将取决于您的要求以及您希望如何定义会话。
如果会话定义为用户注销时 in/logs 退出,那么您只需将代码简单地放在您的登录/注销逻辑中即可
如果您将会话定义为当您的应用程序处于最前面时 ground/until 它会转到 background/killed,这会变得有点复杂。我会尽量提供info/cases:
启动应用程序比较容易,因此,您可以在启动器 activity 的 onCreate
中启动您的服务,如果您子class它
关闭应用程序取决于您定义的 closing
。如果您要求用户明确退出应用程序,则无需处理以下情况:
用户只需按主页按钮即可将应用程序置于后台,在这种情况下 onBackPressed
将不会被调用,并且系统可能会在后台清理您的应用程序,因此您永远不会得到有机会开始你的服务。在这种情况下,系统将调用 onSaveInstanceState
并为您提供启动服务的机会。 (如果您不关心这种情况,那么您应该没问题)。这里的一个极端情况是 onSavedInstance
状态也会在屏幕旋转时调用,因此您需要一些逻辑来区分应用程序何时进入后台与屏幕旋转
附带一件事:
onHandleIntent
在后台线程上调用,因此您可以只使用 find
save
和 unpin
的同步版本,这将帮助您避免所有嵌套。
希望这对您有所帮助。