Android PreferenceActivity:使用onSharedPreferenceChanged()

Android PreferenceActivity:使用onSharedPreferenceChanged(),android,preferenceactivity,Android,Preferenceactivity,所以基本上我有一个PreferenceActivity,我使用它通过扩展AsyncTask的私有类调用Web服务。每当一个偏好发生变化,我都会有一个“巨大的”切换案例来确定哪个偏好发生了变化,然后相应地进行调用 现在我有两个问题: 这似乎是一个“愚蠢”的方式来处理我的问题。你对我该怎么做有什么建议吗 我刚刚做了另一组由N个CheckboxPreferences组成的首选项。在调用类JoinQueueTask().execute(String queue_key)(JoinQueue扩展了Asyn

所以基本上我有一个PreferenceActivity,我使用它通过扩展AsyncTask的私有类调用Web服务。每当一个偏好发生变化,我都会有一个“巨大的”切换案例来确定哪个偏好发生了变化,然后相应地进行调用

现在我有两个问题:

  • 这似乎是一个“愚蠢”的方式来处理我的问题。你对我该怎么做有什么建议吗
  • 我刚刚做了另一组由N个CheckboxPreferences组成的首选项。在调用类JoinQueueTask().execute(String queue_key)(JoinQueue扩展了AsyncTask)时如何“处理”这些问题
  • 相关代码段:


    要回答您的第一个问题,如果您不想使用大开关/案例陈述,您最好的选择是扩展您正在使用的首选项。例如,如果您正在使用大量复选框,只需扩展复选框首选项并将逻辑添加到重写的方法中。根据我的经验,这减少了代码,使逻辑非常容易遵循。如果您需要了解某些东西是如何工作的,或者需要“破解”某些东西,可以在grepcode.com上查看原始源代码。

    好的。你知道我目前的解决方案是不是一种坏习惯吗?@litemode-Umm。。我不会说这是个坏习惯。Android很难处理这种情况,因为首选项更改通常是字符串(当SDK移动到JRE7时,您可以切换字符串)。保持代码松散耦合是一种很好的做法,我认为处理首选项中的首选项更改可以做到这一点。这样,如果添加或删除首选项。。。它只发生在一个地方。但在某些情况下,你所做的是必要的,也是唯一可用的方法,一个你感到舒服的,并且更容易阅读和维护的方法。
        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);
        }   
    
    }