2015-06-12 59 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這將幫助你避免所有的嵌套。

希望這會有所幫助。