mirror of
				https://github.com/mihonapp/mihon.git
				synced 2025-10-31 06:17:57 +01:00 
			
		
		
		
	Observable calls can now be retried, previously all retries were failing
This commit is contained in:
		| @@ -5,24 +5,49 @@ import okhttp3.OkHttpClient | ||||
| import okhttp3.Request | ||||
| import okhttp3.Response | ||||
| import rx.Observable | ||||
| import rx.subscriptions.Subscriptions | ||||
| import java.io.IOException | ||||
| import rx.Producer | ||||
| import rx.Subscription | ||||
| import java.util.concurrent.atomic.AtomicBoolean | ||||
|  | ||||
| fun Call.asObservable(): Observable<Response> { | ||||
|     return Observable.create { subscriber -> | ||||
|         subscriber.add(Subscriptions.create { cancel() }) | ||||
|         // Since Call is a one-shot type, clone it for each new subscriber. | ||||
|         val call = if (!isExecuted) this else { | ||||
|             // TODO use clone method in OkHttp 3.5 | ||||
|             val field = javaClass.getDeclaredField("client").apply { isAccessible = true } | ||||
|             val client = field.get(this) as OkHttpClient | ||||
|             client.newCall(request()) | ||||
|         } | ||||
|  | ||||
|         try { | ||||
|             val response = execute() | ||||
|             if (!subscriber.isUnsubscribed) { | ||||
|                 subscriber.onNext(response) | ||||
|                 subscriber.onCompleted() | ||||
|         // Wrap the call in a helper which handles both unsubscription and backpressure. | ||||
|         val requestArbiter = object : AtomicBoolean(), Producer, Subscription { | ||||
|             override fun request(n: Long) { | ||||
|                 if (n == 0L || !compareAndSet(false, true)) return | ||||
|  | ||||
|                 try { | ||||
|                     val response = call.execute() | ||||
|                     if (!subscriber.isUnsubscribed) { | ||||
|                         subscriber.onNext(response) | ||||
|                         subscriber.onCompleted() | ||||
|                     } | ||||
|                 } catch (error: Exception) { | ||||
|                     if (!subscriber.isUnsubscribed) { | ||||
|                         subscriber.onError(error) | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         } catch (error: IOException) { | ||||
|             if (!subscriber.isUnsubscribed) { | ||||
|                 subscriber.onError(error) | ||||
|  | ||||
|             override fun unsubscribe() { | ||||
|                 call.cancel() | ||||
|             } | ||||
|  | ||||
|             override fun isUnsubscribed(): Boolean { | ||||
|                 return call.isCanceled | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         subscriber.add(requestArbiter) | ||||
|         subscriber.setProducer(requestArbiter) | ||||
|     } | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -39,8 +39,7 @@ class ReaderSettingsDialog : DialogFragment() { | ||||
|  | ||||
|     override fun onViewCreated(view: View, savedState: Bundle?) = with(view) { | ||||
|         viewer.onItemSelectedListener = IgnoreFirstSpinnerListener { position -> | ||||
|             subscriptions += Observable.timer(250, MILLISECONDS) | ||||
|                     .observeOn(AndroidSchedulers.mainThread()) | ||||
|             subscriptions += Observable.timer(250, MILLISECONDS, AndroidSchedulers.mainThread()) | ||||
|                     .subscribe { | ||||
|                         (activity as ReaderActivity).presenter.updateMangaViewer(position) | ||||
|                         activity.recreate() | ||||
| @@ -50,7 +49,6 @@ class ReaderSettingsDialog : DialogFragment() { | ||||
|  | ||||
|         rotation_mode.onItemSelectedListener = IgnoreFirstSpinnerListener { position -> | ||||
|             subscriptions += Observable.timer(250, MILLISECONDS) | ||||
|                     .observeOn(AndroidSchedulers.mainThread()) | ||||
|                     .subscribe { | ||||
|                         preferences.rotation().set(position + 1) | ||||
|                     } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user