Строка, хранящаяся в SharedPreferences, изменяется при каждом закрытии приложения? - PullRequest
0 голосов
/ 17 мая 2018

Итак, я бился над этой проблемой с последних 24 часов, прежде чем начать, позвольте мне прояснить, что эта проблема возникает только на одном из моих мобильных устройств Android, который работает на зефире.

Проблема:

Когда я получаю строковый ответ, используя StringRequest, строка в точности соответствует ее положению, затем я сохраняю ее в SharedPreferences, и значение остается правильным (т.е.) независимо от того, сколько раз я получаю файл из SharedPreferences.Но когда я закрываю приложение и перезапускаю его, а затем извлекаю строку из SharedPreferences, строка каким-то образом изменяется, длина уменьшается,сам по себе в Android зефир.после большой отладки я написал обе строки (от sharedpreferences и на сервере) для разделения файлов .txt во внутреннее хранилище и открыл их как с помощью notepad ++, так и с помощью Voila !, управляющие символы изменены с 'CR LF' на«LF», что приводит к изменению длины строки, хотя длина отличается, когда я сравниваю обе строки на многих онлайн-сайтах, все они говорят: «строки абсолютно идентичны!»: (

Помогите, ребята! Thnx

1 Ответ

0 голосов
/ 18 мая 2018

После долгих хлопот я наконец-то выяснил причину. На некоторых устройствах строковые значения, хранящиеся в SharedPreferences, изменяют свои символы EOL.Разрывы строки в строке преобразуются во что-то отличное от \n, что уменьшает длину строки.Каждый разрыв строки будет уменьшать длину строки на 1 цифру. Решение было простым:

Заменить все разрывы строк на \n после каждого извлечения строки из SharedPreferences.

String fixedString = problemString.replace(System.getProperty("line.separator"),"\\\n" );

также в случаеваша строка содержит строку, отформатированную вручную, которая содержит символы разрыва строки, отличные от \n, вы должны использовать это:

String fixedString = problemString.replace("\r\n|\n|\r", "\\\n");

ОБНОВЛЕНИЕ

ВышеРешение вызовет проблемы, если у вас есть строка, которая уже отформатирована с использованием символов Unix EOL, что делает невозможным использование, если у вас есть несколько строк, отформатированных с использованием различных символов EOL.Поэтому лучший подход, который я нашел, - это просто заменить только возврат каретки, обозначенный \r

String fixedString = brokenString.replace("\r", "");

Этот метод удалит все возврат каретки в вашей строке, поэтому строка преобразуется в формат (Unix LF)из (Windows CR LF) формата.Длина будет уменьшаться на 1 цифру при каждом разрыве строки.:)

...