marduc812 Δημοσ. 9 Οκτωβρίου 2013 Δημοσ. 9 Οκτωβρίου 2013 Καλησπέρα παιδιά.Θέλω να χρησιμοποιήσω το onSaveInstanceState για να κρατάω τις τιμές για την εφαρμογή μου και μετά το κλείσιμό της.Το θέμα είναι από αυτό που είδα έιναι ότι τα κάνει strings και μετά τα καλεί.Εγώ έχω γύρω στους 70 ints υπάρχει τρόπος να το κάνω πιο σύντομα από το να κάνω όλα τα ints -> sttrings και μετα το αντίστροφο;
Directx Δημοσ. 9 Οκτωβρίου 2013 Δημοσ. 9 Οκτωβρίου 2013 Ρίξε μια ματιά στις ρουτίνες getIntArray & putIntArray (και άλλων συμβατών) της Bundle class που σου παρέχει η onSaveInstanceState.
marduc812 Δημοσ. 10 Οκτωβρίου 2013 Μέλος Δημοσ. 10 Οκτωβρίου 2013 Χρησιμοποιώ το OnSaveInstanceState στο onPause όταν κάνει rotate το screen κλπ παίζει κανονικά αλλά όταν πατάω το back (καλεί το onStop) και τα χάνει. Aκολούθησα αυτές τις οδηγίες κανονικά και μου δουλέυει αλλά έχω κολλήσει στο onStop και στο OnDestroy τι πρέπει να κάνω;
warlock9_0 Δημοσ. 10 Οκτωβρίου 2013 Δημοσ. 10 Οκτωβρίου 2013 τι εννοείς το χρησιμοποιείς στο onpause? είναι ξεχωριστή συνάρτηση που καλείται μόνη της, δεν την καλείς εσύ πχ public class MainActivity extends FragmentActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if (savedInstanceState!=null){ data = savedInstanceState.getBoolean("isLoading") } } ....... @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putBoolean("isLoading", isLoading); } .......
marduc812 Δημοσ. 10 Οκτωβρίου 2013 Μέλος Δημοσ. 10 Οκτωβρίου 2013 @Override protected void onSaveInstanceState(Bundle outState) { // TODO Auto-generated method stub super.onSaveInstanceState(outState); outState.putInt("lemons", lemons); klp klp @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onRestoreInstanceState(savedInstanceState); lemons = savedInstanceState.getInt("lemons"); klp klp Το θέμα μου είναι πως όταν κλείσεις την εφαρμογή τα lemons ενώ έχουν πάει ας πούμε 50 όταν την τρέχεις ξανά βρίσκονται στο 0(που είναι το integer στο oncreate). Εκεί κολλάω. Και έχω κανονικά if != null if (savedInstanceState==null) { lemons=0; klp klp } else { lemons = savedInstanceState.getInt("lemons"); moneys.setText("Lemons: " + lemons); klp klp
warlock9_0 Δημοσ. 10 Οκτωβρίου 2013 Δημοσ. 10 Οκτωβρίου 2013 όταν κλείσεις την εφαρμογή σωστά χάνονται όλα, εκεί θες άλλο τρόπο να τα σώσεις πχ SharedPreferences 1
Directx Δημοσ. 10 Οκτωβρίου 2013 Δημοσ. 10 Οκτωβρίου 2013 Αν θες να διατηρείς τα δεδομένα σου και μετά την ολοκληρωτική διακοπή της εφαρμογής σου τότε δες στα onPause και onResume (τα οποία απλοποιούν την διαχείριση του κύκλου ζωής των Activities) και στα SharedPreferences (όπως σωστά ανέφερε ο warlock9_0). Υ.Γ. Ίσως αυτό εδώ σου φανεί χρήσιμο για να μπεις στο πνεύμα του activity-life-cycle.
marduc812 Δημοσ. 11 Οκτωβρίου 2013 Μέλος Δημοσ. 11 Οκτωβρίου 2013 Έχω ψάξει σε 100 μέρη έχω διαβάσει tuts και πάλι όταν πατάω το back arrow δεν τα κάνει save. ¨Εχω τα εξείς τώρα. @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); SharedPreferences settings = getSharedPreferences("MYPREFS", 0); lemons = settings.getInt("lemons", 0); και συνέχεια του κώδικα στο onStop @Override protected void onStop() { // TODO Auto-generated method stub super.onStop(); SharedPreferences settings = getSharedPreferences("MYPREFS", 0); SharedPreferences.Editor editor = settings.edit(); editor.putInt("lemons", lemons); editor.commit(); } Tι έχω λάθος σε αυτό το κομμάτι του κώδικα; 2η μέρα ταλαίπα με το παλιο stop και destroy.
Directx Δημοσ. 11 Οκτωβρίου 2013 Δημοσ. 11 Οκτωβρίου 2013 Στις 10/10/2013 στις 9:56 ΜΜ, marduc812 είπε Έχω ψάξει σε 100 μέρη έχω διαβάσει tuts και πάλι όταν πατάω το back arrow δεν τα κάνει save. ¨Εχω τα εξείς τώρα. @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); SharedPreferences settings = getSharedPreferences("MYPREFS", 0); lemons = settings.getInt("lemons", 0); και συνέχεια του κώδικα στο onStop @Override protected void onStop() { // TODO Auto-generated method stub super.onStop(); SharedPreferences settings = getSharedPreferences("MYPREFS", 0); SharedPreferences.Editor editor = settings.edit(); editor.putInt("lemons", lemons); editor.commit(); } Tι έχω λάθος σε αυτό το κομμάτι του κώδικα; 2η μέρα ταλαίπα με το παλιο stop και destroy. Ταλαιπωρήσει διότι μπλέκεις με event (onStop) τα οποία μπορεί να κληθούν μπορεί όχι, χρησιμοποίησε λοιπόν τα onPause και onResume τα οποία είναι τα μόνα σίγουρα event που καλεί πάντα και υπό οποιασδήποτε συνθήκες το Λ.Σ. (δίχως προϋποθέσεις κλπ) και η άκρη θα βρεθεί. Δες αυτό εδώ το διάγραμμα και τούτο εδώ, η onStop εκτελείται όταν το activity *καταστραφεί - όχι απλά όταν το εγκαταλείψει ο χρήστης αλλά όταν το Λ.Σ. το διαγράψει διότι χρειάζεται πόρους κλπ (αυτό πράγματι δεν φαίνεται καθαρά στο life-cycle και μπορεί να σε ταλαιπωρήσει πολύ). Δεν θα κληθεί απλά διότι ο χρήστης έφυγε από το activity, αντίθετα το onPause θα κληθεί όταν συμβεί αυτό! Τώρα αν σε κάποιο κινητό τηλέφωνο (ή στον emulator) συμπέσει με την έξοδο από το activity να κληθεί η onStop έτυχε, δεν θα συμβεί παντού και πάντα, υπάρχουν προϋποθέσεις! *και αυτό όχι οπωσδήποτε καθώς το documentation μας τα γυρίζει και λέει: Αναφορά σε κείμενο protected void onStop () Added in API level 1 Called when you are no longer visible to the user. You will next receive either onRestart(), onDestroy(), or nothing, depending on later user activity. Note that this method may never be called, in low memory situations where the system does not have enough memory to keep your activity's process running after its onPause() method is called. Derived classes must call through to the super class's implementation of this method. If they do not, an exception will be thrown. Οπότε το μόνο σίγουρο (όσο ο θάνατος) event εδώ είναι το onPause Γενικά, το Android life-cycle είναι από τα πιο στρυφνά τμήματα του συστήματος και με δυσνόητο ή πιο σωστά αμφίσημο και αντικρουόμενο documentation, για να είσαι ασφαλής (σε κάθε configuration/κινητό/tablet, έκδοση Λ.Σ. κλπ) χτίσε την εφαρμογή σου πάνω στα onPause/onResume και δεν θα χάσεις. Καλή συνέχεια! Υ.Γ. Τώρα αν θέλεις να ανιχνεύεις οπωσδήποτε την έξοδο (σαν να λέμε τερματισμό [αν και στο Android αυτή η έννοια δεν είναι ισχυρή]) του χρήστη από το activity (δίχως να σημαίνει και onStop) παγίδευσε το H/W πλήκτρο BACK και μόλις πατηθεί αντέδρασε ανάλογα 1
marduc812 Δημοσ. 11 Οκτωβρίου 2013 Μέλος Δημοσ. 11 Οκτωβρίου 2013 DirectX Και Warlock ευχαριστώ πολύ και τους 2 σας για την βοήθεια.Από ότι φαίνεται το θέμα του κώδικα ήταν ότι το string lemons και το interger lemons είχαν ίδιο όνομα και δεν έτρεχε.Άλλαξα όνομα και τρέχει κανονικά στο onresume.Να ρωτήσω κάτι ακόμα.Για να κάνω να εμφανίζεται η τιμή αμέσως με .settext πρέπει να ξαναδηλώσω τα textviews μεσα στο onResume?
Directx Δημοσ. 11 Οκτωβρίου 2013 Δημοσ. 11 Οκτωβρίου 2013 Αναφορά σε κείμενο Για να κάνω να εμφανίζεται η τιμή αμέσως με .settext πρέπει να ξαναδηλώσω τα textviews μεσα στο onResume? Λογικά όχι, αφού υποθέτω ότι το TextView σου έχει ήδη δηλωθεί στο onCreate (όπου παίρνεις το handle του μέσω findViewById κλπ) και δεδομένου ότι δεν το δημιουργείς δυναμικά (μέσω κάποιου event κλπ) δεν χρειάζεται.
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα