abler98
@abler98
Software Engineer

Dagger 2. В каких случаях происходит пересоздание объекта @Singleton?

AuthModule.class
@Module
class AuthModule
{
    @Provides
    @Singleton
    AuthManager provideAuthManager(Context context) {
        return new AuthManager(context);
    }
}

AppComponent.class:
@Singleton
@Component(modules = {
        AppModule.class,
        DatabaseModule.class,
        AuthModule.class,
})
public interface AppComponent
{
    void inject(MainActivity activity);
}

Application.class:
public class Application extends android.app.Application
{
    private static AppComponent mAppComponent;

    @Override
    public void onCreate() {
        super.onCreate();
        setup();
    }

    public static AppComponent getAppComponent() {
        return mAppComponent;
    }

    private void setup() {
        mAppComponent = DaggerAppComponent.builder()
                .appModule(new AppModule(this))
                .build();
    }
}

BaseActivity.class:
public class BaseActivity extends AppCompatActivity
{
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        onInjectDependency();
    }

    public void onInjectDependency() {
        //
    }
}

MainActivity.class:
public class MainActivity extends BaseActivity
{
    @Inject AuthManager authManager;
    private User user;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        user = authManager.getCurrentUser();
    }

    @Override
    public void onInjectDependency() {
        Application.getAppComponent().inject(this);
    }
}


Пару раз возникала ситуация, в которой происходило пересоздание AuthManager, при чём приложение было активно (видно пользователю). Для моего приложения это очень плохо, так как для доступа к данным авторизации пользователь вводит пин-код (при старте приложения).

С этим можно как-то бороться или нужно рассчитывать на пересоздание?
  • Вопрос задан
  • 349 просмотров
Решения вопроса 1
zagayevskiy
@zagayevskiy Куратор тега Android
Android developer at Yandex
Нужен код, когда вы создаёте компонент и когда инжектите активити. Если он пересоздаётся в такой ситуации - значит вы инжектите несколько раз, при этом используя разные инстансы компонента.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Может так:

private void setup() {
        mAppComponent = DaggerAppComponent.builder()
                .appModule(new AppModule(this))
                .authModule(new AuthModule(this)) //добавить
                .build();
    }
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы