سلام و وقت بخیر. فرض کنید ما یک اپ فروشگاهی داریم و در صفحه اول میخوایم 3 تا ریکوئست مختلف به سرور بزنیم و 3 ریسپانس متفاوت دریافت کنیم. مثلا لیست کالاهای شگفت انگیز ، جدیدترین کالا ها ، پرفروشترین کالا ها.
خب طبیعتا هر ریسپانس در زمان مختلفی دریافت خواهد شد.
حالا سوال من اینجاست که اگر ما یک ProgressBar داشته باشیم ، و تنها زمانی که همه ریسپانس ها دریافت شد بخوایم اون رو مخفی کنیم ، به چه صورتی باید متوجه بشیم که آیا تمام ریسپانس ها دریافت شده یا خیر؟
راه حلی رو پیدا کردم که کدش رو میزارم ، اما میخوام بدونم خود رتروفیت یا RxJava جواب بهتری برای این مسئله دارند یا خیر.
ممنون میشم هرکدوم از دوستان یا استاد شاهینی اگر در این زمینه اطلاعی دارند به اشتراک بزارن.
public class MyActivity extends Activity {
//lot of code omitted
private boolean cIsFinished;
private boolean mIsFinished;
private void getContact(){
//create M and C
m.onResponse(){
//do whatever you want with data and call startIntent
mIsFinished=true;
startIntent();
}
c.onResponse(){
//do whatever you want with data and call startIntent
cIsFinished=true;
startIntent();
}
}
private synchronized void startIntent(){
if(cIsFinished && mIsFinished){
//startIntentHere!
Intent intent = new blah blah blah
}
}
}
سلام و احترام منم راه حل خودمو مینویسم خدمتتون
اگرچه پاسخ اصلی سوال شما نیست
بنظر من ما میتونیم یه instanceVariable تعریف کنیم مثلا int count = ۰ و اونو در جاهایی که response دریافت میشه یکی زیاد کنیم count++
تصور کنیم ۳ تا ریسپانس دریافتی داریم پس میتونیم در انتها شرطی بگذاریم که اگر مقدار این count برابر با ۳ بود پس بیا پروگرس رو غیر فعال کن که هزینه ای هم نداره .
سلام خدمت شما دوست عزیز
برای اینکار باید از BehaviorSubject ها استفاده کنیم به شکل زیر:
class MainViewModel(private val userRepository: UserRepository) {
private var prgMainBehaviorSubject = BehaviorSubject.create<Boolean>()
fun registerToken(token: String): Completable {
prgMainBehaviorSubject.onNext(true)
return userRepository.registerToken(token)
.doOnEvent {
prgMainBehaviorSubject.onNext(false)
}
}
fun getNotifications(): Single<List<Notification>> {
prgMainBehaviorSubject.onNext(true)
return userRepository.getNotifications()
.doOnEvent { t1, t2 ->
prgMainBehaviorSubject.onNext(false)
}
}
fun shouldShowLoading(): BehaviorSubject<Boolean> {
return prgMainBehaviorSubject
}
fun getBanners() : Single<List<Banner>> {
return userRepository.getBanners()
}
}
و در فرگمنت به شکل زیر:
private fun shouldShowLoading() {
val disposable = mainViewModel.shouldShowLoading()
.subscribeOn(AndroidSchedulers.mainThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe {
activity?.findViewById<View>(R.id.layout_loading)
?.setVisibility(if (it) View.VISIBLE else View.GONE)
}
compositeDisposable.add(disposable)
}