2015-06-12 25 views
0

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

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

问题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"); 
             } 
            }); 
           } 
          }); 
         } 
        } 
      } 
     }); 

    } 
} 
+0

添加一些'日志。在'onHandleIntent'的开头部署了'd' – pskink

+0

你确定东西正在本地数据存储中?它可能是你的列表是空的,并且该语句永远不会被记录。您可以尝试在解析调用的旁边记录某些内容。 – Naveed

+0

我将Log.d添加到onHandleIntent的乞求中,它也没有被打印出来。 – 55597

回答

0

问题1:我如何调试任何意向服务? 正如在评论中提到的,您应该能够设置一个断点并将调试器附加到该服务。

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

如果会话被定义时,在用户登录/注销,那么你可以简单地把代码的简单开始你在你的登录/注销逻辑

,如果你定义会话它变得有点复杂,因为因为当你的应用程序在前台/直到它到达背景/遇难。我会尽量提供尽可能多的信息/案件可能:

启动应用程序是最简便的一部分,所以,你可以简单地启动你的服务在你的发射活动onCreate或者甚至ApplicationonCreate如果子类它

关闭应用程序取决于你定义为closing。如果你需要用户明确退出应用程序,那么你不需要照顾下面的情况:

用户可以简单地把应用程序在后台按下主页按钮,在这种情况下onBackPressed将不会并且系统可能会在后台清理您的应用程序,因此您永远无法获得启动服务的机会。在这种情况下,系统将会拨打onSaveInstanceState,让您有机会开始您的服务。 (如果你不在乎这种情况,那么你应该没问题)。这里是一个边缘的情况是,onSavedInstance状态也称为屏幕旋转,所以你需要一些逻辑时,应用程序会在后台对屏幕旋转的侧

有一点区别: onHandleIntent被称为在后台线程,所以你可以使用同步版本findsaveunpin这将帮助你避免所有的嵌套。

希望这会有所帮助。