ارسال چندین ریکوئست همزمان با RxJava

پرسیده شده
فعالیت 1399 روز پیش
دیده شده 1006 بار
0

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

    }    
}

 

فایل پیوست

Toghrol Rc
Toghrol Rc

17 تیر 99

0
حذف شده

سلام و احترام منم راه حل خودمو مینویسم خدمتتون 

اگرچه پاسخ اصلی سوال شما نیست 

بنظر من ما میتونیم یه instanceVariable تعریف کنیم مثلا int count = ۰ و اونو در جاهایی که response دریافت میشه یکی زیاد کنیم count++  

تصور کنیم ۳ تا ریسپانس دریافتی داریم پس میتونیم در انتها شرطی بگذاریم که اگر مقدار این count برابر با ۳ بود پس بیا پروگرس رو غیر فعال کن که هزینه ای هم نداره .

 

 

فایل پیوست

پوریا شفیعی

توسط

پوریا شفیعی

17 تیر 99

حذف شده
که این عمل رو میتونی در بلاک عملگر dofinally هم مدیریت کنین
پوریا شفیعی

19 تیر 99

حذف شده
سلام.فک نکنم این راه حل خوبی باشه چون یک متغیر بین 3 تا ترد مشترک میشه و مسایل مربوط به دسترسی به حافظه مشترک دردسر ساز میشه .
sharareh amiri

31 تیر 99

حذف شده
دوست عزیز زمانی که من این راه حل رو نوشتم مدتیست میگذرد و ما آن موقع به Behaviour Subject که استاد تدریس نمودند تسلط نداشتیم این صرفا راه حل پیشنهادی من بود و راه حل درست آقا وحید فرمودند .
پوریا شفیعی

31 تیر 99

1
حذف شده

سلام خدمت شما دوست عزیز

برای اینکار باید از 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)
    }

 

فایل پیوست

وحید گروسی

توسط

وحید گروسی

18 تیر 99

حذف شده
آقا وحید سلام.. مرسی از جوابهای خوبی که میدید.. لطفا اگه امکانش هست جوابهارو به صورت زبان جاوا بزارید تا مثلا منکه هنوز کاتلین رو شروع نکردم متوجهش بشم و استفاده کنم.. بازم مرسی ولی در کل بعد از کاتلین سری به جوابهاتون میزنم دوباره:)
حذف شده
سلام راستش کل کد هایی که دارم کاتلین هست و جدیدا Rx هم نیست Coroutine هست حالا تونستم چشم
وحید گروسی

1 آذر 99