Измените модифицированную baseurl, инициализированную в классе приложения с помощью dagger2 - PullRequest
0 голосов
/ 21 ноября 2018

Я создал прикладной модуль с именем 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 каждый раз, когда мне нужно.

1 Ответ

0 голосов
/ 21 ноября 2018

Если ваш базовый URL-адрес динамический, вы можете использовать @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

...