簡體   English   中英

共享首選項的行為不當

[英]Misbehavior with sharedpreferences

在您判斷我之前,我想說一下我讀過這些:

但是我仍然不明白,無法使事情正常進行。 我完全不喜歡自己的喜好。 我的代碼:

public static SharedPreferences sharedAppPreferences;
public static final String AppsListKey = "AppListKey";
public static final String AppsPreferences = "AppsPreferences";
public static ArrayList<String> packageNames;

public void chooseApps(View view) {
        sharedAppPreferences = getSharedPreferences(AppsPreferences, Context.MODE_PRIVATE);
        if (sharedAppPreferences.contains(AppsListKey)) {
            Set<String> buffer = new LinkedHashSet<String>(sharedAppPreferences.getStringSet(AppsListKey, new LinkedHashSet<String>()));
            packageNames = new ArrayList<String>(buffer);
        } else {
            packageNames = new ArrayList<String>();
        }
        PackageManager packageManager = getPackageManager();

        int flags = PackageManager.GET_META_DATA | PackageManager.GET_SHARED_LIBRARY_FILES | PackageManager.GET_UNINSTALLED_PACKAGES;
        List<ApplicationInfo> packageList = packageManager.getInstalledApplications(flags);

        for (ApplicationInfo pack : packageList) {

            if (((pack.flags & ApplicationInfo.FLAG_SYSTEM) == 1) || packageNames.contains(pack.loadLabel(packageManager).toString())) {
                // System application or already in array
            } else {
                // Installed by user and isnt in array
                packageNames.add(pack.loadLabel(packageManager).toString());
            }
        }
        Editor editor = sharedAppPreferences.edit();
        Set<String> buffer1 = new LinkedHashSet<String> (packageNames);
        editor.putStringSet(AppsListKey, buffer1);
        editor.commit();
        //packageNames.clear();
        //buffer1.clear();
        buffer1 = new LinkedHashSet<String>(sharedAppPreferences.getStringSet(AppsListKey, new LinkedHashSet<String>()));
        packageNames = new ArrayList<String>(buffer1);
        AppList appList = new AppList();
        appList.show(getSupportFragmentManager(), "AppList");
    }

為什么第一次運行我的應用程序時會顯示如下列表

[Skype, Facebook, Whatsapp, Twitter, Google+]

只要應用程序正在運行就可以...但是如果我殺死我的應用程序並重新啟動,我會得到完全不同的列表,例如

[Whatsapp, Google+, Skype, Twitter, Facebook]

有人可以向我解釋一下這是怎么回事嗎?

列表前后的唯一區別是訂購...

為了擴展我一直在談論的內容,我剛剛意識到您的錯誤。

LinkedHashSet是有序的。 但是,您存儲在

Set<String> buffer 

Set<String>不排序...

因此,它再次變得混亂。

您需要將其存儲在LinkedHashSet參數中,如下所示

LinkedHashSet<String> buffer = new LinkedHashSet<String>(sharedAppPreferences.getStringSet(AppsListKey, new LinkedHashSet<String>()));

(我有兩種情況需要對此進行更改。)

編輯:

您可以做的最后一件事是,而不是創建新列表,而是從共享首選項中投射現有列表...

 LinkedHashSet<String> buffer = (LinkedHashSet<String>)sharedAppPreferences.getStringSet(AppsListKey, new LinkedHashSet<String>());

還有其他選擇HashSets 這里

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM