Использование SharedPreferences в Android вещей - PullRequest
0 голосов
/ 22 июня 2019

Я пытаюсь использовать 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

1 Ответ

1 голос
/ 23 июня 2019

Метод getLong возвращает long, второй параметр вызываемого вами метода - это не ссылка для заполнения, а значение по умолчанию, которое возвращается в случае, если предпочтение не найдено.

ВашКод просто не проверяет возвращаемое значение из общих настроек.

...