Массив пользовательской объектной модели не сохраняется в общих настройках

Я пытаюсь сделать модуль, в котором, как только я получил JSON из API и загружаю его в оперативную память, я сразу же загружаю его в общие настройки, а также после любого изменения данных (в методе onClick адаптера) я повторно сохраните новый измененный массив в общих настройках. По-видимому, это не работает, и я не могу понять, почему.

Вот моя активность, содержащая весь соответствующий код:


package com.example.superheros.Controllers;

import android.content.SharedPreferences;
import android.support.design.widget.CollapsingToolbarLayout;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.widget.ImageView;

import com.example.superheros.Adapter.HeroesAdapter;
import com.example.superheros.Model.Hero;
import com.example.superheros.Networking.HttpRequest;
import com.example.superheros.R;
import com.google.gson.Gson;
import com.squareup.picasso.Picasso;

import java.util.ArrayList;
import java.util.Arrays;

public class MainActivity extends AppCompatActivity {

    //API constant -
    private static final String BASE_URL = "https://heroapps.co.il/employee-tests/android/androidexam.json";
    public static final String SAVED_HERO_LIST = "heroesList";
    // Recyclerview variables -
    private RecyclerView heroesRecylerView;
    private ArrayList<Hero> heroesArrayList;
    private RecyclerView.LayoutManager layoutManager;
    private HeroesAdapter heroesAdapter;
    //Toolbar variables -
    private CollapsingToolbarLayout collapsingToolbarLayout;
    private ImageView toolbarImageView;
    //Persistence variables -
    private Hero selectedFavoriteHero;
    private SharedPreferences sharedPreferences;
    private Gson gson;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        try {
            heroesArrayList = loadFromLocal();
        }catch (Exception ex) {
            ex.printStackTrace();
        }
        if (heroesArrayList != null && heroesArrayList.size() > 0){
            initViews();
        } else {
            initNetworking();
        }

    }

    private void initNetworking() {
        HttpRequest httpRequest = new HttpRequest(this, BASE_URL, new HttpRequest.OnHttpCompleteListener() {
            @Override
            public void onComplete(String response) {
                dataToModel(response, false);
                initViews();
            }

            @Override
            public void onError(String error) {
                Log.d("error", error);
            }
        });
        httpRequest.request();
    }


    private void initViews() {
        heroesRecylerView = findViewById(R.id.herosRecyclerView);
        collapsingToolbarLayout = findViewById(R.id.collapsingHeroToolbarLayout);
        toolbarImageView = findViewById(R.id.toolbarImageview);
        heroesRecylerView.setHasFixedSize(true);
        layoutManager = new LinearLayoutManager(this);
        heroesRecylerView.setLayoutManager(layoutManager);
        heroesAdapter = new HeroesAdapter(heroesArrayList, new HeroesAdapter.OnHeroListClickListener() {
            @Override
            public void onListItemClicked(int position) {
                changeFavoriteHero(position);
            }
        });
        heroesRecylerView.setAdapter(heroesAdapter);

    }

    private void changeFavoriteHero(int position) {
        Hero pressedHeroRow = heroesArrayList.get(position);
        selectedFavoriteHero = pressedHeroRow;
        Picasso.get().load(pressedHeroRow.image)
                .fit()
                .centerCrop()
                .placeholder(R.drawable.ic_launcher_background)
                .error(R.drawable.ic_launcher_foreground)
                .into(toolbarImageView);
        collapsingToolbarLayout.setTitle(pressedHeroRow.title);
        pressedHeroRow.setFavorite(!pressedHeroRow.isFavorite());
        for (int i = 0; i < heroesArrayList.size(); i++) {
            if (i == position) continue;
            heroesArrayList.get(i).setFavorite(false);
        }
        saveToLocal(heroesArrayList);
        heroesAdapter.notifyDataSetChanged();
    }


    private ArrayList<Hero> dataToModel(String json, boolean isLocalInfo) {
        Gson gson = new Gson();
        Hero[] heroesList = gson.fromJson(json, Hero[].class);
        heroesArrayList = new ArrayList<>(Arrays.asList(heroesList));
        if (!isLocalInfo) {
            saveToLocal(heroesArrayList);
        }
        return heroesArrayList;
    }


    //Shared preferences load & save methods -

    private void saveToLocal(ArrayList<Hero> heroesArrayList) {
        sharedPreferences = getPreferences(MODE_PRIVATE);
        SharedPreferences.Editor prefsEditor = sharedPreferences.edit();
        Gson gson = new Gson();
        String heroesList = gson.toJson(heroesArrayList);
        Log.d("heroArrayList", heroesList);
        prefsEditor.putString(SAVED_HERO_LIST, heroesList);
        prefsEditor.apply();
    }

    private ArrayList<Hero> loadFromLocal(){
        sharedPreferences = getPreferences(MODE_PRIVATE);
        try {
            String fetchedHeroesJson = gson.fromJson(SAVED_HERO_LIST, String.class);
            ArrayList<Hero> heroArrayList = dataToModel(fetchedHeroesJson, true);
            return heroArrayList;
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return null;

    }
}


Я надеюсь, что мне могут указать на то, что я пропустил

SharedPreference не является БД памяти. Я не совсем понимаю, что вы хотите сделать. Но полностью удалите приложение (удалите данные), а затем повторите попытку, если хотите удалить данные в SharedPreference.

c-an 29.05.2019 10:21

Я не совсем понимаю тебя.

Alon Shlider 29.05.2019 10:22

пытался удалить и переустановить приложение и ничего нового не сделал

Alon Shlider 29.05.2019 10:25

Будьте конкретны, пожалуйста. Я хотел бы помочь вам. Но не могу понять, что вам нужно.

c-an 29.05.2019 10:27

Строка журнала heroList = gson.toJson(heroesArrayList); эта строка и что она напечатает? контрольная строка не нулевая

Vasudev Vyas 29.05.2019 10:29

проблема в загрузке из локального ArrayList<Hero> loadFromLocal()

Vasudev Vyas 29.05.2019 10:33

vasudev vyas — сделал это, он записывает весь JSON из API. так вроде все работает и проблема не в нем

Alon Shlider 29.05.2019 10:34

проверь ответ и дай мне знать

Vasudev Vyas 29.05.2019 10:38

ты правильно понял дружище. Спасибо

Alon Shlider 29.05.2019 10:40
0
9
36
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

изменять

prefsEditor.apply();

к

prefsEditor.commit();

apply() немедленно фиксирует свои изменения в SharedPreferences в памяти, но запускает асинхронную фиксацию на диск, и вы не будете уведомлены о каких-либо сбоях. Поскольку вы обращаетесь к одному и тому же объекту настроек (является одноэлементным), вы всегда должны видеть согласованное представление, но не в вашем случае, когда вы получаете доступ из отдельного потока.

похоже, не влияет на элемент строки, который я нажал. У меня есть изображение, которое должно меняться в зависимости от того, был ли нажат элемент строки, и кажется, что он его не сохранил.

Alon Shlider 29.05.2019 10:30

хотя есть некоторое интересное поведение - оно загружается намного быстрее, чем при удалении приложения и повторной установке, означает ли это, что данные были получены, но не полностью? или это из-за какой-то другой причины?

Alon Shlider 29.05.2019 10:31
Ответ принят как подходящий

попробуй это.

 private ArrayList<Hero> loadFromLocal(){
        sharedPreferences = getPreferences(MODE_PRIVATE);
        try {
            String fetchedHeroesJson = sharedPreferences.getString(SAVED_HERO_LIST, "null");
            ArrayList<Hero> heroArrayList = dataToModel(fetchedHeroesJson, true);
            return heroArrayList;
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return null;

    }

большое спасибо. решено! проблема заключалась в том, что я пытался получить данные из общих настроек с помощью GSON, ха-ха.

Alon Shlider 29.05.2019 10:39

добро пожаловать, такое бывает... продолжай кодить... получишь прекрасный результат :)

Vasudev Vyas 29.05.2019 10:42

Другие вопросы по теме