В моем приложении некоторые данные передаются в устройство с отметкой времени, поэтому я сохраняю его в структуре Hashtable. Если пользователь желает, он также сохраняется в хранилище для последующего просмотра или отправки по электронной почте в виде файла CSV. Это отлично работает на устройствах iOS и двух разных (не Samsung) брендах Android-устройств под управлением 4.4 и 6.0. Он не работает на Samsung Galaxy S4, работающем 5.0.1.Codename One Сохранение на Samsung Galaxy S4
Программа работает следующим образом, после того, как пользователь нажимает кнопку остановки, следующий метод называется:
public void stopLogging() {
isLogging = false;
dataStorage.flushStorageCache();
dataStorage.writeObject(fileName, dataLogValues);
dataLogValues.clear();
}
dataLogValues является Hashtable.
Когда пришло время доступа к зарегистрированным данным, список доступных имен файлов собирается с помощью кнопок, позволяющих получить доступ к определенному журналу.
public String[] getLogList() {
return dataStorage.listEntries();
}
Где dataStorage ранее инициализируется в конструкторе
dataStorage = Storage.getInstance();
Когда журнал выбран из String [] из записей хранения, следующий метод вызывается для извлечения файла:
public Hashtable<Long, Integer> getLog(String logName) {
dataStorage.clearCache();
Hashtable<Long, Integer> log = (Hashtable<Long, Integer>) dataStorage
.readObject(logName);
return log;
}
На устройстве Samsung я добавил диалоговое окно для отображения каждого имени файла журнала, когда я перебираю строки в именах строк, и получаю только следующее:
"rList- (полное название пакета) .RallyPacControlStub", где RallyPacControl - это имя приложения. Если я также показываю размер строки [], я получаю ожидаемое количество записей для того, сколько журналов я сохранил. Вот код, в котором я обрабатываю записи журнала, и избегаю файлов, которые я не хочу. Файлы журналов, созданные для этого, называются только строкой времени/даты, обозначающей время создания.
String[] logList = dataBuffer.getLogList();
for (int i = 0; i < logList.length; i++) {
Dialog.show("Log name", logList[i], "OK", null);
if (!logList[i].equalsIgnoreCase("Cookies")
&& !logList[i].startsWith("CN1")
&& !logList[i].equals("Infopage")
&& !logList[i].startsWith("Chart")
&& !logList[i].startsWith("Log")) {
String log = logList[i];
Container buttonContainer = new Container();
buttonContainer.setUIID("LogButtonContainer");
buttonContainer.setName("LogListContainer");
buttonContainer.setLayout(new BoxLayout(BoxLayout.X_AXIS));
buttonContainer.add(new ShowLogButton(log, dataBuffer
.getLog(logList[i])));
buttonContainer.add(new ExportLogButton((logList[i])));
buttonContainer.add(new LogDeleteButton(log, this));
logsContainer.add(buttonContainer);
}
}
В 9 из 10 случаев, подобных этому, проблема связана с пользователями, ожидающими 'getClass(). GetName()' для возврата допустимого значения. Ничто из этого не кажется релевантным для проблемы, поскольку вы не показываете какой-либо код, который обращается к хранилищу, и даже то, как сбой хранилища, не очень ясен. –
Я не уверен, что вы имеете в виду, я показал весь код, который обращается к хранилищу. Переменная dataStorage содержит ссылку на Storage.getInstance(). Я использую методы writeObject и readObject для хранения и извлечения. Я использую listEntries для получения списка имен файлов. На большинстве устройств после этого массив String, возвращаемый listEntries, имеет ожидаемые ключи, которые использовались для помещения элементов в хранилище. На устройстве Samsung я получил результат, о котором я говорил выше. Я не знаю, как создавать приложения для Android из источников, но я думаю, мне нужно попробовать, чтобы лучше узнать, что происходит. –
Похоже, что я могу обойти эту проблему, добавив известный префикс к имени файла, а затем только используя элементы из хранилища с этим префиксом. –