gpt4 book ai didi

android - Dagger2 单例注释不起作用

转载 作者:行者123 更新时间:2023-11-29 15:09:33 27 4
gpt4 key购买 nike

所以,一些上下文。我正在使用 Dagger2、Retrofit 和 RxAndroid,并使用 MVP 架构构建我的应用程序。

目前,我所做的只是向 API 发出网络请求,以便在我的主要 Activity 开始后立即检索一些信息。我试图通过配置更改来坚持我的演示者,以避免每次旋转屏幕时都发出新的 http 请求。

MainActivity.java

public class MainActivity extends AppCompatActivity implements ForecastView {


@Inject
Presenter forecastPresenter;

private TextView text;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
text = (TextView) findViewById(R.id.weather);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
initializeDependencies();
initializePresenter();
}

private void initializeDependencies() {
DaggerWeatherApiComponent.builder()
.build().inject(this);
}

private void initializePresenter() {
forecastPresenter.attachView(this);
forecastPresenter.onCreate();

}

WeatherApiComponent.java

@Component(modules = {EndpointsModule.class})
@Singleton
public interface WeatherApiComponent {
void inject(MainActivity context);
}

EndpointsModule.java

@Module @Singleton
public class EndpointsModule {

@Provides
@Singleton
WeatherEndpoints provideEndpoints() {
Retrofit retrofit = new Retrofit.Builder()
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.client(new OkHttpClient())
.baseUrl("http://api.openweathermap.org/data/2.5/")
.build();
return retrofit.create(WeatherEndpoints.class);
}

@Provides
@Singleton
Repository providesRepository(RestRepository repository) {
return repository;
}

@Provides
@Singleton
Presenter providesPresenter(ForecastPresenter presenter) {
return presenter;
}
}

RestRespository

public class RestRepository implements Repository {
private WeatherEndpoints endpoints;
static final String API_KEY = "xxxxxxxxxxxxxxxxxxxxx";

@Inject
public RestRepository(WeatherEndpoints endpoints) {
this.endpoints = endpoints;
}

public Observable<Current> getCurrentWeather(String cityName) {
return endpoints.getCurrent(cityName, API_KEY);
}

public Observable<com.feresr.rxweather.models.List> getForecast(String cityName) {
return endpoints.getForecast(cityName, API_KEY).flatMap(new Func1<FiveDays, Observable<com.feresr.rxweather.models.List>>() {
@Override
public Observable<com.feresr.rxweather.models.List> call(FiveDays fiveDays) {
return Observable.from(fiveDays.getList());
}
});
}

ForecastPresenter.java

public class ForecastPresenter implements Presenter {
private GetForecastUseCase useCase;
private Subscription forecastSubscription;
private ArrayList<List> lists;
private ForecastView forecastView;

@Inject
public ForecastPresenter(GetForecastUseCase forecastUseCase) {
this.useCase = forecastUseCase;
lists = new ArrayList<>();
}

@Override
public void onStop() {
if (forecastSubscription.isUnsubscribed()) {
forecastSubscription.unsubscribe();
}
}

@Override
public void attachView(View v) {
forecastView = (ForecastView) v;
}


@Override
public void onCreate() {
if (lists.isEmpty()) {
forecastSubscription = useCase.execute().subscribe(new Action1<List>() {
@Override
public void call(List list) {
lists.add(list);
forecastView.addForecast(list.getWeather().get(0).getMain());
}
});
} else {
forecastView.addForecast(lists.get(0).toString());
}
}

在我旋转 Acitivity 时,此类(演示者)的构造函数不断调用自身。我已经用@Singleton 注释了我的大部分类(class)。我不知道还能做什么。

编辑:请注意,我还没有进入 dagger SCOPES,现在我不关心这个单例演示者是否与我的应用程序一样长。我稍后会解决这个问题。

最佳答案

看起来每次调用 MainActivity.onCreate(Bundle) 时您都在重新创建 Dagger 组件,并且在您旋转屏幕时重新实例化 Activity 。

与其他作用域一样,@Singleton 意味着将有一个对象实例在组件的生命周期内,而不是在 JVM 的生命周期内。您通常必须自己确保只有一个 @Singleton 组件实例,通常是将其保存在 Application 的一个字段中。

关于android - Dagger2 单例注释不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33152599/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com