#java #android #performance
#java #Android #Производительность
Вопрос:
Я хочу использовать объект во многих местах моего приложения: фрагменты, действия, даже в службах.
Есть ли лучший способ сделать это, чем то, как я сделал это ниже?
Я также хочу знать, есть ли какие-либо другие хорошие практики.
Лучше ли сделать объект статическим или не статичным?
Всегда ли класс приложения хранит объект, когда я вызываю его из каких-либо действий или фоновых служб?
public class MyApplication extends Application {
private static DaoMaster.DevOpenHelper dao;
@Override
public void onCreate() {
super.onCreate();
dao = new DaoMaster.DevOpenHelper(this,
getString(R.string.db_name), null);
}
public static DaoMaster.DevOpenHelper getDao() {
return dao;
}
public static void setDao(DaoMaster.DevOpenHelper dao) {
MyApplication.dao = dao;
}
}
Ответ №1:
Мне не нравятся статические поля и методы. Я думаю, что это неправильно для парадигмы ООП. Вы можете столкнуться с множеством проблем, связанных с многопоточным доступом к вашей базе данных.
В вашем случае вы можете хранить объект как нестатическое поле и получать к нему доступ из activity или service следующим образом:
((MyApplication) getApplication()).getDao()
Для случая, подобного вашему, вы можете использовать внедрение зависимостей. Для этого на Android есть хорошая библиотека (Dagger от squareUp). С его помощью вы можете легко «внедрить» свой объект во многие места.
Комментарии:
1. хорошо, спасибо за вашу помощь, я действительно не понимал внедрение зависимостей
2. ((MyApplication) getApplication()).getDao() создает ли это проблему, когда я вызываю его из службы, которая просматривает службы сигнализации или любое другое место, отличное от Activity
3. @saleeh93 Я предлагаю вам попробовать. Но будьте осторожны, потому что dagger хорош для Android, а RoboJuice — нет. Плохая идея использовать библиотеку DI, которая использует отражение. Кинжал — это DI времени компиляции, а не время выполнения.
4. @saleeh93 он должен работать в режиме обслуживания и активности. В других местах вы должны получить доступ к объекту действия, а затем получить доступ к объекту действия выброса приложения. DI решит эту проблему.
5. Спасибо за вашу помощь, я попробую