تابستون داره تموم میشه ها، فرصت‌ها محدودن کلی آفر جذاب در کمپین تابستون🔥👇
۰ ثانیه
۰ دقیقه
۰ ساعت
۲ Toghrol Rc
ارسال چندین ریکوئست همزمان با RxJava
جامعه جاوا (اندروید) ایجاد شده در ۱۷ تیر ۱۳۹۹

سلام و وقت بخیر. فرض کنید ما یک اپ فروشگاهی داریم و در صفحه اول میخوایم 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)
    }

 

وحید گروسی ۱۸ تیر ۱۳۹۹، ۰۶:۵۷