调试同步ParseObjects

时间:2015-06-12 18:46:29

标签: android android-intent intentservice android-debug

我有一个使用parse.com作为后端的android项目。为了减少api调用的数量,我一直把“不太重要”的数据固定到本地数据存储并试图在每次用户会话时同步它。我正在使用IntentService。我正在调用IntentService,如下所示。但是当调用IntentService时,我没有看到任何Log消息或调试断点被调用。

问题1:如何调试任何Intent服务?

问题2:我希望每个用户会话执行一次服务(每次用户打开和关闭应用程序时)。我不想将代码添加到活动的onPause方法,因为我的应用程序有多个活动,因此会话中多次调用onPause。因此,我从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");
                                        }
                                    });
                                }
                            });
                        }
                    }
            }
        });

    }
}

1 个答案:

答案 0 :(得分:0)

问题1:如何调试任何Intent服务? 如评论中所述,您应该能够设置断点并将调试器附加到服务。

问题2:我想执行服务......? 这取决于您的要求以及您希望如何定义会话。

如果一个会话定义为用户登录/注销时你可以简单地把代码放在你的登录/注销逻辑中

如果你将一个会话定义为你的应用程序处于前台/直到它进入后台/被杀死的话,它会变得有点复杂。我会尽量提供尽可能多的信息/案例:

启动应用程序是一个更容易的部分,因此,您只需在启动器活动的onCreate中启动服务,如果您将其分类,则可以onCreate Application

关闭应用取决于您定义的closing。如果您要求用户明确退出应用程序,则无需处理以下情况:

用户可以通过按主页按钮将应用程序放在后台,在这种情况下,onBackPressed将不会被调用,系统可能会在后台清理您的应用程序,这样您就永远无法获得有机会开始你的服务。在这种情况下,系统将调用onSaveInstanceState并为您提供启动服务的机会。 (如果你不关心这个案子那么你应该没问题)。这里的一个优点是在屏幕旋转时也会调用onSavedInstance状态,因此您需要一些逻辑来区分应用程序何时进入背景与屏幕旋转

有一件事: 在后台线程上调用onHandleIntent,因此您只需使用find saveunpin的同步版本,这将有助于避免所有嵌套。

希望这有帮助。