Size: a a a

StartAndroid Ru Chat

2021 November 14

ID

Igor D in StartAndroid Ru Chat
Подскажите. Между экранами бегаю c помощью navigate(). У меня viewmodel’и не уничтожаются (не происходит onCleared()). Есть практики их уничтожать при открытии нового фрагмента или они должны всегда в памяти жить?
источник

ID

Igor D in StartAndroid Ru Chat
Вьюмодели создаются во фрагментах:
val viewModel: ListUserViewModel by viewModels()
источник

В

Виктор in StartAndroid Ru Chat
При открытии нового фрагмента инстанс предыдущего останется в памяти(с уничтоженным view). Соответственно нет причин для уничтожения ViewModel.
источник

ID

Igor D in StartAndroid Ru Chat
Но когда у нас с десяток фрагментов пройдено пользователем, не ужели это считается нормально, что там все viewmodel’и живут в памяти?
источник

В

Виктор in StartAndroid Ru Chat
А вы в курсе вообще для чего гугл создала ViewModel?)
источник

ID

Igor D in StartAndroid Ru Chat
Да, но вопрос в том, что фрагмент мы покинули. Зачем нам живущий viewmodel. Ладно бы фрагмент вращался / стопался и тд. А тут ясно navigate вызвали с него… Но ладно, видимо так и живем )
источник

В

Виктор in StartAndroid Ru Chat
Если бы ViewModel уничтожалась при переходах, то она бы никому не нужна была. ViewModel уничтожится лишь при переходе назад или закрытии приложения, т.е. после onDestroy фрагмента. Если вас беспокоит количество инстансов ViewModel-ей в памяти, то не делайте отдельную для каждого фрагмента, а делайте одну общую, привязанную к активити.
источник

ID

Igor D in StartAndroid Ru Chat
У меня собственно проблема то в том, чтобы добавить в okhttp интерцептор с новыми параметрами. API через DI создается, инжектится во вьюмодель. А как его пересобрать, чтобы новые параметры в okhttp добавились - не могу представить
источник

В

Виктор in StartAndroid Ru Chat
Можно инджектить в свойство с геттером, а не в конструктор. Или в какую-нибудь функцию, где юзаете инстанс okhttp.
источник

ID

Igor D in StartAndroid Ru Chat
так он у меня в API используется, а API создается ретрофитом, а тот использует okHTTP. все они в модуле живут, а во viewmodel инжектится только API. В общем головоломка (
источник

ID

Igor D in StartAndroid Ru Chat
@Provides
   fun provideRetrofit(client: OkHttpClient, gson: Gson): Retrofit {
       return Retrofit.Builder()
           .baseUrl(BuildConfig.BASE_URL)
           .client(client)
           .addConverterFactory(GsonConverterFactory.create(gson))
           .addCallAdapterFactory(CoroutineCallAdapterFactory())
           .build()
   }

   @Provides
   fun providesOkHttpClient(httpLoggingInterceptor: HttpLoggingInterceptor, apiKeyRepository: ApiKeyRepository): OkHttpClient {
       val apiKey = apiKeyRepository.getApiKey()
       return OkHttpClient.Builder().writeTimeout(1, TimeUnit.MINUTES)
           .readTimeout(1, TimeUnit.MINUTES)
           .callTimeout(1, TimeUnit.MINUTES)
           .addInterceptor(httpLoggingInterceptor)
           .addInterceptor(AuthRetrofitInterceptor("$apiKey"))
           .build()
   }

   @Provides
   @Singleton
   fun providesRepoApi(retrofit: Retrofit) : RepoApi {
       return retrofit.create(RepoApi::class.java)
   }
источник

ID

Igor D in StartAndroid Ru Chat
это в networkmodul’e. А в viewmodel’е уже:
@HiltViewModel
class ListUserViewModel @Inject constructor(
   private val userRepository: UserRepository,
   private val repoRepository: RepoRepository
): BaseViewModel() {
источник

В

Виктор in StartAndroid Ru Chat
В даггере особо не шарю, но у вас тут итак синглтон. Т.е. всегда один и тот же инстанс ретрофита независимо от инстанса ViewModel
источник

ID

Igor D in StartAndroid Ru Chat
так то да, даже если синглтон уберу - он заново не будет создаваться, тк viewmodel не пересоздается для фрагмента…
источник

В

Виктор in StartAndroid Ru Chat
Я вам уже подсказал как это обойти. Если нужен всегда новый инстанс ретрофита, то уберите синглтон и не инджектите его в конструктор. Получайте в геттере или функции.
источник

ID

Igor D in StartAndroid Ru Chat
Спасибо! В целом должно сработать. Думаю может еще инстанс ретрофита взять и, может в него как-нить можно добавить интерцептор…
источник

O

ORIK in StartAndroid Ru Chat
Ребят у вас нет мессенджеров которые вы писали от скуки или не реализовали!?
источник

ID

Igor D in StartAndroid Ru Chat
Да вроде нет. А зачем тебе именно не реализованный? Их же куча реализованных на гите.
источник

O

ORIK in StartAndroid Ru Chat
Для создания соцсетей
источник

EB

Elisey Budnitsky in StartAndroid Ru Chat
Так сам напиши, в чем проблема?
источник