Я пытаюсь использовать SharedPreferences в своем приложении Things, но по какой-то причине оно всегда возвращает 0.Мой установщик получает запись, что он выдвигал нужные данные с помощью редактора, но каждое чтение, даже после перезапуска действия, всегда равно 0. Я не могу найти причину, по которой Things не позволяет использовать SharedPreferences, даже снеобходимо изменить разрешение, так что я в растерянности.Это, очевидно, мой код, но я не могу понять, почему.
Моя цель - использовать TextView, который можно использовать, чтобы просто обновлять дату при касании.Нет кнопок, нет реального взаимодействия, и это просто и чисто.Но если SharedPreferences не работает, это становится более сложным.
У меня были разные способы создания экземпляров объекта SharedPreferences в OnCreate, каждый раз, когда я использую его безрезультатно.Я также использовал глобальный и локальный редактор для Activity, но безрезультатно.Кажется, что запись успешна, но чтение всегда возвращает 0 для getLong ().Я переключаюсь с apply () на commit (), думая, что, возможно, это просто проблема синхронизацииТем не менее, при выходе и повторном запуске действия также не отображается значение, оно по-прежнему равно 0.
То, что включено, является последним, основанным на том, что я нашел в документации Android, на основе того, что я знаю о Java.Первый - это то, что я считаю актуальным для вопроса.Второй пример кода - это полное действие.
public class DataViewActivity extends Activity {
private static final String TAG = DataViewActivity.class.getSimpleName();
TextView m_textViewTemperature;
TextView m_textViewWaterLevel;
TextView m_textViewIronAddition;
TextView m_textViewWaterChange;
TextView m_textViewFilterChange;
Handler m_exitHandler = new Handler();
SharedPreferences m_preferences;
public static final String PREFERENCES = "aquarium";
public static final String WATER_CHANGE = "waterchange";
public static final String FILTER_CHANGE = "filterchange";
public static final String IRON_ADD = "ironaddition";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d(TAG, "onCreate");
setContentView(R.layout.activity_data_view);
m_preferences = getSharedPreferences(PREFERENCES, Context.MODE_PRIVATE);
m_textViewTemperature = findViewById(R.id.textViewTemperatureData);
m_textViewWaterLevel = findViewById(R.id.textViewWaterLevelData);
m_textViewFilterChange = findViewById(R.id.textViewFilterChangeDateData);
m_textViewIronAddition = findViewById(R.id.textViewIronAdditionDateData);
m_textViewWaterChange = findViewById(R.id.textViewWaterChangeDateData);
m_textViewWaterChange.setOnTouchListener(new View.OnTouchListener() {
@SuppressLint("ClickableViewAccessibility")
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
Long time = Calendar.getInstance().getTimeInMillis();
SharedPreferences.Editor e = m_preferences.edit();
e.putLong(WATER_CHANGE, time);
e.commit();
Log.i(TAG, "Stored " + time + " to shared preferences for last water change");
updateWaterChangeDate();
}
return false;
}
});
}
private void updateWaterChangeDate()
{
Calendar c = Calendar.getInstance();
Long item = m_preferences.getLong("WaterChange", 0);
Log.d(TAG, "Got " + item + " for last water change millis");
c.setTimeInMillis(item);
SimpleDateFormat df = new SimpleDateFormat("EEE, MMM d");
m_textViewWaterChange.setText(df.format(c.getTime()));
}
<code>package com.home.pete.aquarium;
import androidx.appcompat.app.AppCompatActivity;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.widget.TextView;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Timer;
import java.util.TimerTask;
import java.util.prefs.Preferences;
import static com.home.pete.aquarium.Constants.VIEW_TIMEOUT;
import static java.lang.Long.getLong;
/**
* Skeleton of an Android Things activity.
* <p>
* Android Things peripheral APIs are accessible through the class
* PeripheralManagerService. For example, the snippet below will open a GPIO pin and
* set it to HIGH:
*
* <pre>{@code
* PeripheralManagerService service = new PeripheralManagerService();
* mLedGpio = service.openGpio("BCM6");
* mLedGpio.setDirection(Gpio.DIRECTION_OUT_INITIALLY_LOW);
* mLedGpio.setValue(true);
* }
*
* Для более сложных периферийных устройств найдите существующий драйвер пользовательского пространства или внедрите его, если его нет *.* * @see https://github.com/androidthings/contrib-drivers#readme * / открытый класс DataViewActivity extends Activity {private static final String TAG = DataViewActivity.class.getSimpleName ();TextView m_textViewTempera;TextView m_textViewWaterLevel;TextView m_textViewIronAddition;TextView m_textViewWaterChange;TextView m_textViewFilterChange;Обработчик m_exitHandler = новый обработчик ();SharedPreferences m_preferences;public static final String PREFERENCES = "аквариум";public static final String WATER_CHANGE = "waterchange";public static final String FILTER_CHANGE = "filterchange";public static final String IRON_ADD = "ironaddition";@Override protected void onCreate (Bundle saveInstanceState) {super.onCreate (сохраненныйInstanceState);Log.d (TAG, "onCreate");setContentView (R.layout.activity_data_view);m_preferences = getSharedPreferences (PREFERENCES, Context.MODE_PRIVATE);m_textViewTempera = findViewById (R.id.textViewTemperaData);m_textViewWaterLevel = findViewById (R.id.textViewWaterLevelData);m_textViewFilterChange = findViewById (R.id.textViewFilterChangeDateData);m_textViewIronAddition = findViewById (R.id.textViewIronAdditionDateData);m_textViewWaterChange = findViewById (R.id.textViewWaterChangeDateData);m_textViewWaterChange.setOnTouchListener (new View.OnTouchListener () {@SuppressLint ("ClickableViewAccessibility") @Override public boolean onTouch (View v, событие MotionEvent) {if (event.getAction () == MotionEvent.ACTION_DOWN {Longtime) {Calendar)getInstance (). getTimeInMillis (); SharedPreferences.Editor e = m_preferences.edit (); e.putLong (WATER_CHANGE, время); e.commit (); Log.i (TAG, «Сохранено» + время + »для общих настроекдля последнего изменения воды "); updateWaterChangeDate ();} return false;}});m_textViewIronAddition.setOnTouchListener (new View.OnTouchListener () {@SuppressLint ("ClickableViewAccessibility") @Override public boolean onTouch (View v, событие MotionEvent) {if (event.getAction () == MotionEvent.ACTION_DOWN.) Time. деЫпзЬапс () getTimeInMillis ();SharedPreferences.Editor e = m_preferences.edit ();
e.putLong (IRON_ADD, время);
e.commit ();
Log.i (TAG, «Сохранено» + время + «в общие настройки для последнего добавления железа»);
updateIronAdditionDate ();
}
вернуть ложь;
}
});
m_textViewFilterChange.setOnTouchListener (new View.OnTouchListener () {
@SuppressLint ( "ClickableViewAccessibility")
@Override
public boolean onTouch (Просмотр v, событие MotionEvent) {
if (event.getAction () == MotionEvent.ACTION_DOWN) {
Долгое время = Calendar.getInstance (). GetTimeInMillis ();
SharedPreferences.Editor e = m_preferences.edit ();
e.putLong (FILTER_CHANGE, время);
e.commit ();
Log.i (TAG, «Сохранено» + время + «в общие настройки для последнего изменения фильтра»);
updateFilterChangeDate ();
}
вернуть ложь;
}
});
LocalBroadcastManager.getInstance (this) .registerReceiver (TemperatureUpdate, new IntentFilter ("температура"));
LocalBroadcastManager.getInstance (this) .registerReceiver (waterlevelUpdate, new IntentFilter ("waterlevel"));
updateFilterChangeDate ();
updateIronAdditionDate ();
updateWaterChangeDate ();
m_exitHandler.postDelayed (exitViewOnTimeout, VIEW_TIMEOUT);
}
@Override
protected void onDestroy () {
Log.d (TAG, "onDestroy");
super.onDestroy ();
}
закрытое void updateFilterChangeDate ()
{
Calendar c = Calendar.getInstance ();
Long item = m_preferences.getLong ("FilterChange", 0);
c.setTimeInMillis (пункт);
SimpleDateFormat df = new SimpleDateFormat ("EEE, MMM d");
m_textViewFilterChange.setText (df.format (c.getTime ()));
}
закрытое void updateWaterChangeDate ()
{
Calendar c = Calendar.getInstance ();
Long item = m_preferences.getLong ("WaterChange", 0);
Log.d (TAG, «Got» + item + «для последней смены воды в миллис»);
c.setTimeInMillis (пункт);
SimpleDateFormat df = new SimpleDateFormat ("EEE, MMM d");
m_textViewWaterChange.setText (df.format (c.getTime ()));
}
private void updateIronAdditionDate ()
{
Calendar c = Calendar.getInstance ();
Long item = m_preferences.getLong ("IronAddition", 0);
c.setTimeInMillis (пункт);
SimpleDateFormat df = new SimpleDateFormat ("EEE, MMM d");
m_textViewIronAddition.setText (df.format (c.getTime ()));
}
public void exitView (Просмотр представления)
{
Log.d (TAG, «Закрытие просмотра»);
m_exitHandler.removeCallbacks (exitViewOnTimeout);
Конец();
}
private BroadcastReceiver TemperatureUpdate = new BroadcastReceiver () {
@Override
public void onReceive (контекстный контекст, намерение намерения)
{
Double value = intent.getDoubleExtra ("ACTION", 0.0);
m_textViewTempera.setText (value.toString () + "\ u2109");
}
};
private BroadcastReceiver waterlevelUpdate = new BroadcastReceiver () {
@Override
public void onReceive (контекстный контекст, намерение намерения)
{
Целочисленное значение = intent.getIntExtra ("ACTION", 0);
Текст строки;
если (значение> 2760)
text = "full";
иначе, если (значение> 2750)
текст = "-1 см";
иначе, если (значение> 2730)
текст = "-2 см";
еще
text = value.toString ();
m_textViewWaterLevel.setText (текст);
}
};
@Override
protected void onResume () {
super.onResume ();
}
private Runnable exitViewOnTimeout = new Runnable () {
@Override
public void run () {
Log.d (TAG, «Закрытие вида из-за обработчика тайм-аута»);Конец();
}
};
}
Ведение журнала показывает, что действительное значение в миллисекундах хранится в Long в OnTouchListener, который вызывается, когда я касаюсь TextView. Каждый вызов updateWaterChangeDate () регистрирует 0 для элемента, а Дата всегда 1-го числа 1970 года.
2019-06-22 09:20:20.483 2614-2614/com.home.pete.aquarium I/DataViewActivity: Stored 1561213220471 to shared preferences for last water change
2019-06-22 09:20:20.484 2614-2614/com.home.pete.aquarium D/DataViewActivity: Got 0 for last water change millis
...
2019-06-22 09:20:25.647 2614-2614/com.home.pete.aquarium D/DataViewActivity: onDestroy
2019-06-22 09:20:26.710 2614-2614/com.home.pete.aquarium D/MainActivity: Viewing settings
2019-06-22 09:20:26.737 2614-2614/com.home.pete.aquarium D/DataViewActivity: onCreate
2019-06-22 09:20:26.834 2614-2614/com.home.pete.aquarium D/DataViewActivity: Got 0 for last water change millis