2016-10-15 3 views
-1

просто попросите вас о лучшем способе сброса всех переменных класса MainActivity, когда пользователь хочет выйти из системы, чем тот, который я представляю здесь.Android: Сбросить переменные класса при выходе из системы MainActivity

public class MainActivity 
      extends AppCompatActivity{ 


     public static String userId; 
     private ArrayList<String> list1 = new ArrayList<>(); 
     private ArrayList<String> list2 = new ArrayList<>(); 
     private Prefs prefs; 


     private void logOut(){ 
      userId = null; 
      list1 = new ArrayList<>(); 
      // Helperlist of all the Ids in "friends" 
      list2 = new ArrayList<>(); 
      prefs = null; 

      onCreate(null); 
     } 
    } 

Переменные класса userId, list1, list2 и prefs устанавливаются где-то в другом месте для конкретного пользователя. Если пользователь выходит из системы, он должен быть «нулевым». Проблема заключается в том, что каждый раз, когда я хочу добавить переменную класса, она также должна быть «нулевой» в logOut(). Это может быть легким источником ошибок, если я собираюсь добавить все больше и больше переменных класса. Можете ли вы дать мне лучший способ сделать это?

Спасибо,

Ayox

+0

Объем переменных класса заканчивается при уничтожении класса. Если вы поддерживаете выход из системы и авторизуетесь в одной и той же деятельности, тогда нет другого способа, насколько я знаю, кроме как свести его на нет. –

ответ

0

Я бы предложил не использовать static для переменных класса (как и в случае userId).

Кроме того, так как ваши переменные класса будут хранить данные сеанса связанных, вы можете вместо этого хранить его в SharedPreferences и просто вызвать prefs.clear() на выходе из системы, где метод clear() может быть определен как нечто вроде SharedPreferences#edit().clear().apply();

+0

static: да, я должен изменить это, на моем todolist sharedPreferences: не помогите или немного сложно, так как у меня также есть переменные из собственных созданных объектов, но я буду считать это, если нет лучшего решения – Ayox

0

Я могу» не думайте о каком-либо лучшем решении, кроме внедрения интерфейса Closeable и очищайте переменные в методе close(), а затем вызывайте его при выходе из системы. И я бы предложил переименовать/удалить метод logOut, поскольку он делает что-то еще, и, вероятно, это ответственность лежит в другом классе.

1

Рекомендация, вызывая методы жизненного цикла Android самостоятельно, считается «плохой практикой».

Я бы рекомендовал вам эту выписку из onCreate метода всей пользовательской инициализации в пользовательском метод, а затем вызвать его из logOut()

Надеется, что это помогает!

+0

, почему это плохая практика? или в чем его недостаток? – Ayox

+0

Поскольку они являются методами обратного вызова, и они вызываются системой Android в определенных точках исполнения вашего приложения, например, когда создается действие или когда оно восстанавливается. – jos

1

Вы можете использовать Reflection для сброса всех переменных экземпляра. Это не изящное решение, но оно гарантирует, что все переменные будут аннулированы.

Field[] fields = object.getClass().getDeclaredFields(); 
for (Field f : fields) { 
    f.setAccessible(true); 
    f.set(object, null); 
} 
+0

Это действительно хороший и простой способ. Почему это не считается «элегантным»? – Ayox

+0

Потому что отражение делает ваш код немного медленнее. Таким образом, это соотношение между скоростью и удобством. –

+0

Thanks Rick; Я хочу добавить, что существуют также ограничения безопасности и подверженность внутренним элементам: https://docs.oracle.com/javase/tutorial/reflect/ – Ayox

Смежные вопросы