2012-03-15 54 views
0

所以基本上我有一個PreferenceActivity,我用它通過擴展AsyncTask的私有類來調用Web服務。每當首選項發生變化,我都有一個「巨大的」「切換案例」,確定哪個首選項已更改,然後相應地進行呼叫。PreferenceActivity:使用onSharedPreferenceChanged()

現在我有兩個問題:

  1. 這似乎是一個「愚蠢」的方式來處理我的問題。你對我應該做什麼有什麼建議嗎?
  2. 我剛剛製作了另一組由N CheckboxPreferences組成的首選項。如何在調用類JoinQueueTask()。execute(String queue_key)(JoinQueue extends AsyncTask)方面「處理」這些問題?

相關的代碼片段:

public void onSharedPreferenceChanged(SharedPreferences arg0, String key) 
{ 
    if(isFirstRun) 
     return; 

    // Call Forward Preferences 
    if(key.contentEquals("call_forward_always")) 
    { 
     cfInfo[0] = "1"; 
     cfInfo[1] = arg0.getString(key, "ERROR"); 
     new PushCallForwardInfoTask().execute(cfInfo); 
     ep1.setSummary("Viderestiller til " + cfInfo[1]); 
    } 
    else if(key.contentEquals("call_forward_busy")) 
    { 
     cfInfo[2] = "1"; 
     cfInfo[3] = arg0.getString(key, "ERROR"); 
     new PushCallForwardInfoTask().execute(cfInfo); 
     ep2.setSummary("Viderestiller til " + cfInfo[3]); 
    } 
    else if(key.contentEquals("call_forward_noresponse")) 
    { 
     cfInfo[4] = "1"; 
     cfInfo[5] = arg0.getString(key, "ERROR"); 
     new PushCallForwardInfoTask().execute(cfInfo); 
     ep3.setSummary("Viderestiller til " + cfInfo[5]); 
    } 
    else if(key.contentEquals("call_forward_timeout")) 
    { 
     cfInfo[6] = arg0.getString(key, "ERROR"); 
     new PushCallForwardInfoTask().execute(cfInfo); 
     ep4.setSummary("Viderestiller efter " + cfInfo[6] + " sekunder"); 
    } 

    // Show Number Preferences 
    else if(key.contentEquals("shownumber_list")) 
    { 
     String[] newnumber = {""}; 
     newnumber[0] = arg0.getString(key, "ERROR"); 
     new PushNumberTask().execute(newnumber); 
     lp.setSummary(arg0.getString(key, "ERROR")); 
    } 

    // Voicemail Preferences 
    else if(key.contentEquals("voicemail_checkbox")) 
    { 
     final Boolean[] vmStatus = { Boolean.FALSE }; 
     vmStatus[0] = cp.isChecked(); 
     new PushVoicemailStatus().execute(vmStatus); 
    } 

} 

回答

0

要回答你的第一個問題,如果你不希望處理使用一個大的switch/case語句你最好的選擇將是延長的喜好您正在使用。例如,如果您使用大量複選框,則只需擴展複選框首選項並將您的邏輯添加到重寫的方法。根據我的經驗,這會削減代碼並使邏輯非常易於遵循。你可以在grepcode.com上看到原始的源代碼,如果你需要了解某些東西在工作或者需要「破解」某些內容。

+0

好的。你知道我目前的解決方案是否是不好的做法嗎? – CodePrimate 2012-03-15 12:53:23

+0

@litemode嗯..我不會說這是不好的做法。 Android很難處理這種情況,因爲首選項更改通常是字符串(當SDK移動到JRE7時,您可以切換字符串)。保持代碼鬆散耦合是一種很好的做法,我認爲處理偏好會改變偏好項目。這樣,如果偏好被添加或刪除......它只發生在一個地方。但是,有些情況下,你正在做的事情是必要的,唯一可用的方式,一個你感到舒適並且易於閱讀和維護的方法。 – jjNford 2012-03-15 13:09:24