Tracę dane podczas wyrzucania aplikacji z pamięci

0

Hej,
Mam pewien problem otóż nie wiem dlaczego jak wyrzucam aplikację z pamięci dane podanego obiektu są tracone , natomiast jak wychodzę z aplikacji dane te są.

public class MySharedPreference {

    public static final String PREFS_NAME = "LIST_CARD";
    public static final String CARD = "CARD";


    public MySharedPreference() {
        super();
    }

    public void saveCardToSharedPreference(Context context, ArrayList<Card> cardList) {

        SharedPreferences settings;
        SharedPreferences.Editor editor;
        settings = context.getSharedPreferences(PREFS_NAME, MODE_PRIVATE);
        editor = settings.edit();
        Gson gson = new Gson();

        String jsonString = gson.toJson(cardList);
        editor.putString(CARD, jsonString);
        editor.commit();
    }

    public ArrayList getCardList(Context context) {

        SharedPreferences sharedPreferences;
        List<Card> card;

        sharedPreferences = context.getSharedPreferences(PREFS_NAME,
                Context.MODE_PRIVATE);

        if (sharedPreferences.contains(CARD)) {
            String jsonCard = sharedPreferences.getString(CARD, null);
            Gson gson = new Gson();
            Card[] cardItem = gson.fromJson(jsonCard, Card[].class);
            card = Arrays.asList(cardItem);
            card = new ArrayList(card);
        } else
            return null;
        return (ArrayList) card;
    }
}

public class MainActivity extends AppCompatActivity {

    public ArrayList<Card> cardsList = new ArrayList<Card>();

    @Override
    protected void attachBaseContext(Context newBase) {
        super.attachBaseContext(newBase);
    }

    private TextView textCard;
    private CardAdapter cardAdapter;
    private RecyclerView cardRecyclerView;
    private LinearLayout cardLayout;
    private MySharedPreference mySharedPreference;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        Typeface custom_fonts = Typeface.createFromAsset(getAssets(), "fonts/OpenSans-Regular.ttf");
        Typeface custom_fonts2 = Typeface.createFromAsset(getAssets(), "fonts/OpenSans-Bold.ttf");
        mySharedPreference = new MySharedPreference();


        cardLayout = (LinearLayout) findViewById(R.id.layoutEmptyCard);
        cardLayout.setVisibility(View.VISIBLE);

        Default app = (Default) getApplicationContext();
        cardsList = app.getListCard();


        if (cardsList.size() > 0) {
            cardsList = new ArrayList<Card>();
            cardsList = app.getListCard();
            cardLayout.setVisibility(View.GONE);

            mySharedPreference.getCardList(MainActivity.this);
            cardRecyclerView = (RecyclerView) findViewById(R.id.recycleViewCard);
            cardAdapter = new CardAdapter(this, cardsList);
            cardRecyclerView.setLayoutManager(new LinearLayoutManager(MainActivity.this));
            cardRecyclerView.setAdapter(cardAdapter);

        }
        if (cardsList.size() == 0) {
            cardLayout.setVisibility(View.VISIBLE);
        }

        TextView title_app = (TextView) findViewById(R.id.toolbar_title);
        title_app.setTypeface(custom_fonts);

        textCard = (TextView) findViewById(R.id.textCard);
        textCard.setTypeface(custom_fonts);

        Button addCardButton = (Button) findViewById(R.id.addCardButton);
        addCardButton.setTypeface(custom_fonts2);
        addCardButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                addCard();
            }
        });
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.menu, menu);
        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        if (id == R.id.addCard) {
            addCard();
        }

        return super.onOptionsItemSelected(item);
    }

    private void addCard() {
        Intent intent = new Intent(MainActivity.this, GetNumberActivity.class);
        startActivity(intent);
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
            try {
                this.finishAffinity();
            } catch (Exception e) {
            }
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }
}

0

Gdzieś zapisujesz dane do SharedPreferences? Ponieważ, ja tego nie widzę.

0

Zapisywanie do Shareprepernce odbywa się w innej aktywności :)

0

Kochana, nie można takich rzeczy robić! Czy wiesz jak wygląda Activity lifecycle w Androidzie? Gdy Activity znika z ekranu, to wykonuje się metoda onStop() i tam pewnie masz zapisywanie tych danych. Tymczasem istnieje możliwość, że te Activity znika i pojawia się inne w którym dane ponownie modyfikujesz, ale nie zapisujesz, licząc na to, że te pierwsze Activity je zapisze, tymczasem to się nigdy nie dzieje, ponieważ pierwsze Activity już nie wejdzie w stan onStop() (bo już w nim jest) tylko wykona się onDestroy() i po frytkach.

Z tego powodu jeżeli używasz SharedPreferences to zapisuj dane w każdym Activity w którym je modyfikujesz.

Poza tym podczas siłowego wyrzucenia z pamięci nie wykonują się metody lifecycle, w związku z tym rozważ czy nie zapisać danych natychmiast po ich modyfikacji.

1 użytkowników online, w tym zalogowanych: 0, gości: 1