使用dagger2更改在应用程序类中初始化的改造基本URL

塞雷斯·卡比尔

我创建了名为Application的应用程序模块AppRetroServiceModule以提供改进。

@Module(includes = NetworkModule.class)
public class AppRetroServiceModule {

    @Provides
    @AppScope
    public RetroService retroService(Retrofit retrofit) {
        return retrofit.create(RetroService.class);
    }

    @Provides
    @AppScope
    public Retrofit retrofit(OkHttpClient okHttpClient, Gson gson) {
        return new Retrofit.Builder()
                .addConverterFactory(GsonConverterFactory.create(gson))
                .client(okHttpClient)
                .baseUrl("http://webservise/Srv1.svc/json/")
                .build();
    }
}

如您所见,baseUrl是硬编码和固定的。在应用程序组件中,当应用程序组件是其他组件的依赖项时,我创建了getter来进行改造和其他提供程序:

@AppScope
@Component(modules = {NetworkModule.class, AppRetroServiceModule.class})
public interface IApplicationComponent {
    RetroService getRetroService();

    Gson getGsonBuilder();

    Context getAppContext();
}  

我在应用程序类中初始化了匕首:

public class App extends Application {
    private IApplicationComponent component;
    ...
    @Override
    public void onCreate() {
        super.onCreate();

        Timber.plant(new Timber.DebugTree());
        component = DaggerIApplicationComponent.builder()
                .networkModule(new NetworkModule(this))
                .build();

    }...

    public IApplicationComponent getAppComponent() {
        return component;
    }
}

现在在主要活动中,我需要使用其他baseurl方法从服务器获取数据:

public class MainActivity extends AppCompatActivity implements IMain.IMainView {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_m);
        ButterKnife.bind(this);
        setSupportActionBar(toolbar);

        DaggerIMainComponent.builder()
                .iApplicationComponent(((App) getApplication()).getAppComponent())
                .build()
                .inject(this);
    ...

由于改造是在启动应用程序时初始化的,因此baseurl当我需要从其他活动或片段的服务器中获取数据时,如何随时更改改造有时我需要连接到许多服务器,并从这些服务器中获取数据并在一项活动中使用,然后我需要更改baseurl所有需要的内容。

潘卡·库玛(Pankaj Kumar)

如果您的基本网址是动态的,则可以使用@Url这将帮助您将动态基本URL传递给您的请求。

public interface RetrofitClient {

    // Simple call with dynamic url
    @GET
    public Call<YouModelClass> doSomeRequest(@Url String url);

    // Call with dynamic url and request parameter
    @GET
    public Call<YouModelClass> doSomeRequest(@Url String url, @Query("id") String id);

    // Call with dynamic url and more request parameters
    @GET
    public Call<YouModelClass> doSomeRequest(@Url String url, @Query("id") String id, @Query("key") String key, @Query("part") String part);
}

调用代码将是

RetrofitClient service = retrofit.create(RetrofitClient.class);
Call<YouModelClass> call = service.doSomeRequest("your_dynamic_url_with_base_url");
// and so on

阅读更多 Retrofit 2 — How to Use Dynamic Urls for Requests

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Tomcat Java Servlet-在应用程序启动时初始化类

初始化Android应用程序

Dagger2 + Kotlin:lateinit属性尚未初始化

如何在angular2应用程序中初始化Ag-Grid API

多个角度应用程序初始化程序

如何在控制台应用程序中禁用log4j2的自动初始化?

MVP + Dagger2 + Kotlin:lateinit属性演示者尚未初始化

带有Dagger2的Android Kotlin,lateinit var尚未初始化

Android:Dagger2组件无法识别应用程序类

使用依赖注入的TypeScript应用程序初始化

在Spring Boot应用程序中使用Liquibase初始化内存中的H2以进行单元测试

初始化应用程序时出错:无此类属性:类的会话:BootStrap

实例化应用程序对象并初始化列表

为什么应用程序委托类无法初始化?

Rails应用程序不会使用hive_geoip2 gem在弹性beantalk上进行初始化

更改Laravel应用程序的基本URL

初始化全局类并使其在整个节点应用程序中可用

Gregory Kick了解dagger2 ScopedProvider中的惰性初始化单例

在WPF应用程序中如何在没有主类的情况下初始化数据库(使用Entity Framework进行代码优先)

使用构造函数初始化反应应用程序

在 Springboot 应用程序类中初始化 Service 和 Repository 类

在应用程序中初始化改造客户端

Xamarin Forms 初始化应用程序类中的插件

如何处理应用程序后台以恢复使用 Dagger2 注入的 Exoplayer?

如果使用 Dagger2 初始化对象,是否仍然需要检查对象是否为空?

使用 dagger2 初始化 WorkManger 时使用“WorkContinuation.combine()”时出现的问题

在 Android 6.0 中使用 Dagger2 初始化 Worker 时,应用程序不断崩溃

使用 dagger2 和 MVVM 为两个不同的基本 URL 创建多个改造实例

Azure 中应用服务的应用程序初始化不起作用