-
Notifications
You must be signed in to change notification settings - Fork 7.6k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Version 0.16.0 Release Candidate #601
Comments
Items of discussion or that I would like to resolve before releasing:
|
Because |
ObserveOn fixes: #602 |
I guess you're right. Never mind :-) |
I've looked at the
|
All of Rx allows this as it is up to the provider to obey the contract and not call them concurrently. That is why we don't synchronize everything in Rx, for performance reasons. |
Rx Design Guideline 6.8
Due to this, a It is however tricky to achieve both of these since we want to ensure we don't have race-conditions in observers subscribing and seeing the correct view of events. That said, we don't want to add unnecessary synchronization. For example, on We don't want to pay the overhead of synchronization on |
/cc @akarnokd @headinthebox @zsxwing I am ready to release 0.16.0 after running it on a Netflix API production canary to assert performance and functionality of the core operators, schedulers, etc (at least of what we use, not new operators). I'm blocked on a build issue that I can't solve until tomorrow at the office so will release sometime Tuesday hopefully. |
Following are the changes and release notes for 0.16.0. Since so much has changed for this release I want to give people a chance to review and try the code before releasing.
Changes:
Version 0.16.0 (Maven Central)
first
rx.concurrency
package has been renamed torx.schedulers
. Existing classes still remain inrx.concurrency
but are deprecated. Use ofrx.concurrency
should be migrated torx.schedulers
as these deprecated classes will be removed in a future release.Scala Release Notes
This release of the RxScala bindings builds on the previous 0.15 release to make the Rx bindings for Scala
include all Rx types. In particular this release focuses on fleshing out the bindings for the
Subject
andScheduler
types, as well as aligning the constructor functions for
Observable
with those in the RxJava.Expect to see ongoing additions to make the Scala binding match the equivalent underlying Java API,
as well as minor changes in the existing API as we keep fine-tuning the experience on our way to a V1.0 release.
Observer
In this release we have made the
asJavaObserver
property inObservable[T]
as well the the factory method in thecompanion object that takes an
rx.Observer
private to the Scala bindings package, thus properly hiding irrelevantimplementation details from the user-facing API. The
Observer[T]
trait now looks like a clean, native Scala type:To create an instance of a specific
Observer
, sayObserver[SensorEvent]
in user code, you can create a new instanceof the
Observer
trait by implementing any of the methods that you care about:or you can use one of the overloads of the companion
Observer
object by passing in implementations of theonNext
,onError
oronCompleted
methods.Note that typically you do not need to create an
Observer
since all of the methods that accept anObserver[T]
(for instance
subscribe
) usually come with overloads that accept the individual methodsonNext
,onError
, andonCompleted
and will automatically create anObserver
for you under the covers.While technically it is a breaking change make the
asJavaObserver
property private, you should probably not havetouched
asJavaObserver
in the first place. If you really feel you need to access the underlyingrx.Observer
call
toJava
.Observable
Just like for
Observer
, theObservable
trait now also hides itsasJavaObservable
property and makes the constructorfunction in the companion object that takes an
rx.Observable
private (but leaves the companion object itself public).Again, while technically this is a breaking change, this should not have any influence on user code.
The major changes in
Observable
are wrt to the factory methods where too libral use of overloading of theapply
method hindered type inference and made Scala code look unnecessarily different than that in other language bindings.
All factory methods now have their own name corresponding to the Java and .NET operators
(plus overloads that take a
Scheduler
).def from[T](future: Future[T]): Observable[T]
,def from[T](iterable: Iterable[T]): Observable[T]
,def error[T](exception: Throwable): Observable[T]
,def empty[T]: Observable[T]
,toObservable: Observable[T]
onList[T]
.In the pre-release of this version, we expose both
apply
andcreate
for the mother of all creation functions.We would like to solicit feedback which of these two names is preferred
(or both, but there is a high probability that only one will be chosen).
def apply[T](subscribe: Observer[T]=>Subscription): Observable[T]
def create[T](subscribe: Observer[T] => Subscription): Observable[T]
Subject
The
Subject
trait now also hides the underlying JavaasJavaSubject: rx.subjects.Subject[_ >: T, _<: T]
and takes only a single invariant type parameter
T
. all existing implementations ofSubject
are parametrizedby a single type, and this reflects that reality.
For each kind of subject, there is a class with a private constructor and a companion object that you should use
to create a new kind of subject. The subjects that are available are:
AsyncSubject[T]()
,BehaviorSubject[T](value)
,Subject[T]()
,ReplaySubject[T]()
.The latter is still missing various overloads http://msdn.microsoft.com/en-us/library/hh211810(v=vs.103).aspx which
you can expect to appear once they are added to the underlying RxJava implementation.
Compared with release 0.15.1, the breaking changes in
Subject
for this release aremaking
asJavaSubject
private, and collapsing its type parameters, neither of these should cause trouble,and renaming
PublishSubject
toSubject
.Schedulers
The biggest breaking change compared to the 0.15.1 release is giving
Scheduler
the same structure as the other types.The trait itself remains unchanged, except that we made the underlying Java representation hidden as above.
as part of this reshuffling, the scheduler package has been renamed from
rx.lang.scala.concurrency
to
rx.lang.scala.schedulers
. There is a high probability that this package renaming will also happen in RxJava.In the previous release, you created schedulers by selecting them from the
Schedulers
object,as in
Schedulers.immediate
orSchedulers.newThread
where each would return an instance of theScheduler
trait.However, several of the scheduler implementations have additional methods, such as the
TestScheduler
,which already deviated from the pattern.
In this release, we changed this to make scheduler more like
Subject
and provide a family of schedulersthat you create using their factory function:
CurrentThreadScheduler()
,ExecutorScheduler(executor)
,ImmediateScheduler()
,NewThreadScheduler()
,ScheduledExecutorServiceScheduler(scheduledExecutorService)
,TestScheduler()
,ThreadPoolForComputationScheduler()
,ThreadPoolForIOScheduler()
.In the future we expect that this list will grow further with new schedulers as they are imported from .NET
(http://msdn.microsoft.com/en-us/library/system.reactive.concurrency(v=vs.103).aspx).
To make your code compile in the new release you will have to change all occurrences of
Schedulers.xxx
into
XxxScheduler()
, and importrx.lang.scala.schedulers
instead ofrx.lang.scala.schedulers
.Subscriptions
The
Subscription
trait in Scala now hasisUnsubscribed
as a member, effectively collapsing the oldSubscription
and
BooleanSubscription
, and the latter has been removed from the public surface. Pending a bug fix in RxJava,SerialSubscription
implements its ownisUnsubscribed
.To create a
Subscription
use one of the following factory methods:Subscription{...}
,Subscription()
,CompositeSubscription(subscriptions)
,MultipleAssignmentSubscription()
,SerialSubscription()
.In case you do feel tempted to call
new Subscription{...}
directly make sure you wire upisUnsubscribed
and
unsubscribe()
properly, but for all practical purposes you should just use one of the factory methods.Notifications
All underlying wrapped
Java
types in theNotification
trait are made private like all previous types. The companionobjects of
Notification
now have both constructor (apply
) and extractor (unapply
) functions:The nested companion objects of
Notification
now have both constructor (apply
) and extractor (unapply
) functions:To construct a
Notification
, you importrx.lang.scala.Notification._
and useOnNext("hello")
,or
OnError(new Exception("Oops!"))
, orOnCompleted()
.To pattern match on a notification you create a partial function like so:
case Notification.OnNext(v) => { ... v ... }
,or you use the
apply
function to pass in functions for each possibility.There are no breaking changes for notifications.
Java Interop Helpers
Since the Scala traits wrap the underlying Java types, yoo may occasionally will have to wrap an unwrap
between the two representations. The
JavaConversion
object provides helper functions of the formtoJavaXXX
andtoScalaXXX
for this purpose, properly hiding how precisely the wrapped types are stored.Note the (un)wrap conversions are defined as implicits in Scala, but in the unlikely event that you do need them
be kind to the reader of your code and call them explicitly.
The text was updated successfully, but these errors were encountered: