2017-10-01 8 views
1

VacationFragment의 onAttach()에서 VacationViewModel -> VacationRepository, 에서 featuredDays()를 호출하고 있습니다. VacationFragment로 이동하는보기를 클릭하면 알림이 표시되고 지연이 열리 며 몇 밀리 초를 기다립니다. 그것은 VacationFragment를 엽니 다. 내가 vacationViewModel.featureDays (은 시작일, 종료일) 을 주석있을 때 그것은 전체 채팅/댓글을 읽는되지 않습니다 누군가를 위해 지연왜 개체를 주입하고 io() 스레드에서 API 호출을하면 조각 열기가 느려 집니까?

class MainApplication : Application(), HasActivityInjector, HasSupportFragmentInjector { 
override fun onCreate() { 
super.onCreate() 
appComponent = DaggerAppComponent.builder().androidModule(AndroidModule(this)).build() 
appComponent.inject(this) 
} 

class VacationFragment : Fragment() { 

    override fun onAttach(context: Context?) { 
AndroidSupportInjection.inject(this) 
super.onAttach(context) 
vacationViewModel = ViewModelProviders.of(activity, icaViewModelFactory).get(VacationViewModel::class.java) 
vacationViewModel.featureDays(startDate,endDate)} 
} 

class VacationViewModel : ViewModel(), AppComponent.Injectable { 

private val disposables: CompositeDisposable = CompositeDisposable() 

    @Inject 
lateinit var vacationRepository: VacationRepository 
val featuredFeaturedCalendar: MediatorLiveData<FeaturedCalendar> = MediatorLiveData() 

fun featureDays(from: String, till: String) { 

val disposable = vacationRepository 
    .featuredCalendar(from, till, KEY, ID) 
    .map { featuredCalendar -> 
     val holidays = arrayListOf<FeaturedCalendar.Holiday>() 
     featuredCalendar.holidays.forEach { holidayItem -> 
     val holiday = FeaturedCalendar.Holiday(format.parse(holidayItem.date), holidayItem.holiday) 
     holidays.add(holiday) 
     } 
     FeaturedCalendar(featuredCalendar.status, holidays) 
    } 
    .subscribeOn(Schedulers.io()) 
    .observeOn(mainThread()) 
    .subscribe(
     { 
      featuredFeaturedCalendar.postValue(it) 
     }, 
     { 
      throw IllegalStateException(it) 
     }) 

    disposables.add(disposable) 
}} 


class VacationRepository(private val apiDaysSeResource: ApiDaysSeResource) { 

    fun featuredCalendar(from: String, till: String, key: String, id: String): Flowable<FeaturedCalendar> { 
return apiDaysSeResource.days(from, till, key, id)//.toFlowable() 
    } 

}

public interface ApiDaysSeResource { 
Flowable<FeaturedCalendar> days(@Query("fran") String fran, @Query("till") String till, @Query("key") String key, @Query("id") String id); 
} 
+0

몇 가지 이유가 있습니다. 1. 원래 스레드에서'map()'이 일어나고 있습니다. 2.'observeOn()'이 정말 느린 일을하고있을 수도 있습니다. 구독을 한 후에 일회용은 실제로 'null'일 수 있습니까? 그 수 표가 필요하다고 생각하지 마십시오. – milosmns

+0

@milosmns 나는 검사의 부분을 제거했습니다. 지도() 부분과이 코드의 featuresCeendardCalendar.postValue (it) 과 동일한 내용을 주석으로 달기를 원하면 아무런 차이가 없습니다. –

+0

음. 좋아요, 아마도 그것은 어쩐지 느린 모델일까요? 어쩌면 당신의'onAttach()'가 느려지는 것을 할 것인가? – milosmns

답변

0

없이 조각을 엽니 다 섹션에서 OP - 문제가 ApiDaysSeResource 클래스에서 발생 했으므로 생성이 완료되는 데 많은 시간이 걸립니다. onAttach()에서 분사가 동 기적으로 발생하기 때문에 시작시 감속이 분명합니다. 테스트 OP에서, 그 경기 침체가 1.0 - 1.5 초, 많은 것으로 보인다.

여유 시간이있는 경우이 문제에 대한 긴 게시물과 완료까지 오랜 시간이 걸리는 생성자에 액세스 할 수 없을 때 비동기 적으로 싱글 톤을 주입하는 방법을 썼습니다. 기사를 읽으려면 Click here

기본 아이디어는 YourSlowThing 대신 Observable<YourSlowThing>을 삽입하는 것입니다.이 아이디어를 사용하면 인스턴스를 사용할 수있을 때까지 기다릴 수는 있지만 시작시 null이 아닌 종속성을 계속 얻을 수 있습니다.