Comments (21)
I've moved to io.reactivex:rxandroid:0.23.0
and still see this issue. @mttkay have you found something?
from rxandroid.
No. I was able to reproduce it and got stuck by the time Android was
starting to call into native code.
Any suggestions for how to even debug this welcome!
On Nov 21, 2014 4:12 PM, "Tomasz Rozbicki" [email protected] wrote:
I've moved to io.reactivex:rxandroid:0.23.0 and still see this issue.
@mttkay https://github.com/mttkay have you found something?—
Reply to this email directly or view it on GitHub
#21 (comment).
from rxandroid.
Here's what I've got so far. Sometimes I can find in the crash reports stack trace like below:
16:13:01.654 E Caused by: rx.exceptions.CompositeException$CompositeExceptionCausalChain: Chain of Causes for CompositeException In Order Received =>
16:13:01.654 E at android.util.Log.getStackTraceString(Log.java:410)
16:13:01.654 E at android.util.Slog.e(Slog.java:151)
16:13:01.654 E at com.android.internal.os.RuntimeInit$UncaughtHandler.uncaughtException(RuntimeInit.java:85)
16:13:01.654 E at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:693)
16:13:01.654 E at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:690)
16:13:01.654 E at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:56)
16:13:01.654 E ... 9 more
16:13:01.654 E Caused by: java.net.ConnectException: failed to connect to /192.168.2.10 (port 8080) after 20000ms: isConnected failed: ECONNREFUSED (Connection refuse
d)
16:13:01.654 E at libcore.io.IoBridge.isConnected(IoBridge.java:223)
16:13:01.654 E at libcore.io.IoBridge.connectErrno(IoBridge.java:161)
16:13:01.654 E at libcore.io.IoBridge.connect(IoBridge.java:112)
...
The most interesting part is: android.util.Log.getStackTraceString(Log.java:410)
Looks like this class has been modified by manufacturer, the original one in API21 has only 225 lines, but in fact we don't know if the method implementation is different or not.
Now a simple test, put this code in the onError
callback (You can use whatever logging utility you want). The seconds method is from Guava.
UnknownHostException hostException = new UnknownHostException("test");
Timber.e("Log", Log.getStackTraceString(hostException));
Timber.e("Guava", Throwables.getStackTraceAsString(hostException));
And here's the output. Nothing is printed from android.util.Log.getStackTraceString
method. I have only Samsung devices, could somebody test this on Nexus with KitKat or at least confirm this on another Samsung device? I've tested it on S4, S5 and Note 3 all with 4.4.2.
16:43:51.151 SomeClass E Log
16:43:51.181 E Guava java.net.UnknownHostException: test
...
16:43:51.181 E at rx.Observable$33.onError(Observable.java:7307)
16:43:51.181 E at rx.observers.SafeSubscriber._onError(SafeSubscriber.java:127)
16:43:51.181 E at rx.observers.SafeSubscriber.onError(SafeSubscriber.java:96)
16:43:51.181 E at rx.internal.operators.NotificationLite.accept(NotificationLite.java:147)
16:43:51.181 E at rx.internal.operators.OperatorObserveOn$ObserveOnSubscriber.pollQueue(OperatorObserveOn.java:177)
16:43:51.181 E at rx.internal.operators.OperatorObserveOn$ObserveOnSubscriber.access$000(OperatorObserveOn.java:65)
16:43:51.181 E at rx.internal.operators.OperatorObserveOn$ObserveOnSubscriber$2.call(OperatorObserveOn.java:153)
16:43:51.181 E at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:45)
16:43:51.181 E at android.os.Handler.handleCallback(Handler.java:733)
16:43:51.181 E at android.os.Handler.dispatchMessage(Handler.java:95)
16:43:51.181 E at android.os.Looper.loop(Looper.java:136)
16:43:51.181 E at android.app.ActivityThread.main(ActivityThread.java:5586)
16:43:51.181 E at java.lang.reflect.Method.invokeNative(Native Method)
16:43:51.181 E at java.lang.reflect.Method.invoke(Method.java:515)
16:43:51.181 E at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1268)
16:43:51.181 E at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1084)
16:43:51.181 E at dalvik.system.NativeStart.main(Native Method)
from rxandroid.
The reason of the exception (in my case) is this line in SafeSubscriber.java line 174
throw new OnErrorFailedException("Error occurred when trying to propagate error to Observer.onError", new CompositeException(Arrays.asList(e, e2)));
It throws exception because e2 is null.
In my case, the Throwable I pass to onError()
method is android.os.NetworkOnMainThreadException
I think a buffer solution would be checking if e2 is null.
I'm using rxandroid 0.23 and Android 5.0.1 x86 emulator. Hope this can help.
from rxandroid.
UnknownHostException
's trace is never logged, FYI, as you can see in the source of Log.java
. Is there still an issue beyond that?
from rxandroid.
I was getting a similar error whenever I used RetrofitError.getBody inside RxJava Subscriber.onError. Turns out it was being caused by the getBody call itself throwing an exception. Since initCause, setStackTrace, readObject, and addSuppressed all internally throw exceptions - maybe it's related.
from rxandroid.
I think this issue is mentioned here http://stackoverflow.com/questions/24860942/observer-onerror-firing-off-inconsistently.
from rxandroid.
@farmazon3000 you're right. I'm not sure it still happens in the latest version of Rx, can somebody confirm?
from rxandroid.
I'm using
compile 'io.reactivex:rxjava:1.0.12'
compile 'io.reactivex:rxandroid:0.24.0'
and it does happen.
from rxandroid.
Those aren't the latest versions of RxJava and RxAndroid. The latest are:
compile 'io.reactivex:rxjava:1.0.14'
compile 'io.reactivex:rxandroid:1.0.1'
from rxandroid.
I am on the latest version
E/AndroidRuntime: java.lang.IllegalStateException: Fatal Exception thrown on Scheduler.Worker thread.
E/AndroidRuntime: at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:62)
E/AndroidRuntime: at android.os.Handler.handleCallback(Handler.java:733)
E/AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:95)
E/AndroidRuntime: at android.os.Looper.loop(Looper.java:136)
E/AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:5001)
E/AndroidRuntime: at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime: at java.lang.reflect.Method.invoke(Method.java:515)
E/AndroidRuntime: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
E/AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
E/AndroidRuntime: at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime: Caused by: rx.exceptions.OnErrorFailedException: Error occurred when trying to propagate error to Observer.onError
E/AndroidRuntime: at rx.observers.SafeSubscriber._onError(SafeSubscriber.java:201)
E/AndroidRuntime: at rx.observers.SafeSubscriber.onError(SafeSubscriber.java:111)
E/AndroidRuntime: at rx.observers.SafeSubscriber.onNext(SafeSubscriber.java:137)
E/AndroidRuntime: at rx.internal.operators.OperatorObserveOn$ObserveOnSubscriber.pollQueue(OperatorObserveOn.java:208)
E/AndroidRuntime: at rx.internal.operators.OperatorObserveOn$ObserveOnSubscriber$2.call(OperatorObserveOn.java:170)
E/AndroidRuntime: at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:55)
E/AndroidRuntime: at android.os.Handler.handleCallback(Handler.java:733)
E/AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:95)
E/AndroidRuntime: at android.os.Looper.loop(Looper.java:136)
E/AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:5001)
E/AndroidRuntime: at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime: at java.lang.reflect.Method.invoke(Method.java:515)
E/AndroidRuntime: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
E/AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
E/AndroidRuntime: at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime: Caused by: rx.exceptions.CompositeException: 2 exceptions occurred.
E/AndroidRuntime: at rx.observers.SafeSubscriber._onError(SafeSubscriber.java:201)
E/AndroidRuntime: at rx.observers.SafeSubscriber.onError(SafeSubscriber.java:111)
E/AndroidRuntime: at rx.observers.SafeSubscriber.onNext(SafeSubscriber.java:137)
E/AndroidRuntime: at rx.internal.operators.OperatorObserveOn$ObserveOnSubscriber.pollQueue(OperatorObserveOn.java:208)
E/AndroidRuntime: at rx.internal.operators.OperatorObserveOn$ObserveOnSubscriber$2.call(OperatorObserveOn.java:170)
E/AndroidRuntime: at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:55)
E/AndroidRuntime: at android.os.Handler.handleCallback(Handler.java:733)
E/AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:95)
E/AndroidRuntime: at android.os.Looper.loop(Looper.java:136)
E/AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:5001)
E/AndroidRuntime: at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime: at java.lang.reflect.Method.invoke(Method.java:515)
E/AndroidRuntime: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
E/AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
E/AndroidRuntime: at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime: Caused by: rx.exceptions.CompositeException$CompositeExceptionCausalChain: Chain of Causes for CompositeException In Order Received =>
E/AndroidRuntime: at crittercism.android.bk.a(Unknown Source)
E/AndroidRuntime: at crittercism.android.bk.<init>(Unknown Source)
E/AndroidRuntime: at crittercism.android.az.a(Unknown Source)
E/AndroidRuntime: at crittercism.android.ay.uncaughtException(Unknown Source)```
from rxandroid.
Looks like it has nothing to do with RxAndroid. Your app's code threw an exception (most likely in your onError handler):
E/AndroidRuntime: at crittercism.android.bk.a(Unknown Source)
E/AndroidRuntime: at crittercism.android.bk.<init>(Unknown Source)
E/AndroidRuntime: at crittercism.android.az.a(Unknown Source)
E/AndroidRuntime: at crittercism.android.ay.uncaughtException(Unknown Source)
from rxandroid.
I just got it again (this time because I had a TextInputLayout without a child EditText) - but at least I knew what to look for. It would be nice if my own code showed up in the stack trace somewhere. Without that it turns out to be much harder to track down.
Key though - it's always because your onError is calling something that is throwing an error of some kind (may be runtime, error, etc - not necessarily a compile time exception).
from rxandroid.
This issue is old, and has no clear action to take. The most recent comments are normal errors being incorrectly attributed to this issue. As far as I can tell CE is now behaving in an acceptable manner and even if it wasn't this isn't the project which could change it.
from rxandroid.
We're experiencing this issue also in our code. Clearly, its an application issue where somewhere the onError
implementation throws. However, RxJava makes it hard to point out where exactly this happens, because CompositeException
swallows onError
s exception iff it shares a cause with the original throwable. Here is the code:
List<Throwable> listOfCauses = getListOfCauses(e);
// check if any of them have been seen before
for(Throwable child : listOfCauses) {
if (seenCauses.contains(child)) {
// already seen this outer Throwable so skip
e = new RuntimeException("Duplicate found in causal chain so cropping to prevent loop ...");
continue;
}
seenCauses.add(child);
}
So, say the chain throws e1
and your code in onError
throws e2
while being "somehow" a good citizen and remembers the original e1
as cause. e2
will then completely get evicted / replaced with a new RuntimeException
telling us "Duplicate found in causal chain so cropping to prevent loop ...". If you then work with Crashlytics, you will not see anything beside this very runtime exception (even without the exception message, since this is not part of Crashlytics' output for causes for whatever reason). And you will not see anything on logcat, because the exception chain is already way too long.
from rxandroid.
Can we create a very small sample (preferably without using anything
Android-specific) that reproduces the problem?
On Mon, May 23, 2016 at 1:23 PM Thomas Keller [email protected]
wrote:
We're experiencing this issue also in our code. Clearly, its an
application issue where somewhere the onError implementation throws.
However, RxJava makes it hard to point out where exactly this happens,
because CompositeException swallows onErrors exception iff it shares a
cause with the original throwable. Here is the code:List<Throwable> listOfCauses = getListOfCauses(e); // check if any of them have been seen before for(Throwable child : listOfCauses) { if (seenCauses.contains(child)) { // already seen this outer Throwable so skip e = new RuntimeException("Duplicate found in causal chain so cropping to prevent loop ..."); continue; } seenCauses.add(child); }
So, say the chain throws e1 and your code in onError throws e2 while
being "somehow" a good citizen and remembers the original e1 as cause. e2
will then completely get evicted / replaced with a new RuntimeException
telling us "Duplicate found in causal chain so cropping to prevent loop
...". If you then work with Crashlytics, you will not see anything beside
this very runtime exception (even without the exception message, since this
is not part of Crashlytics' output for causes for whatever reason). And you
will not see anything on logcat, because the exception chain is already way
too long.—
You are receiving this because you modified the open/close state.
Reply to this email directly or view it on GitHub
#21 (comment)
from rxandroid.
Using rxjava 1.1.1 - given this:
public class Main {
public static void main(String[] args) {
Observable
.error(new IllegalArgumentException("illegal argument"))
.subscribe(
success -> {},
error -> {
throw new IllegalStateException("illegal state exception", error); // Main.java, line 13
}
);
}
}
I see this:
Exception in thread "main" rx.exceptions.OnErrorFailedException: Error occurred when trying to propagate error to Observer.onError
at rx.observers.SafeSubscriber._onError(SafeSubscriber.java:192)
at rx.observers.SafeSubscriber.onError(SafeSubscriber.java:120)
at rx.Observable$ThrowObservable$1.call(Observable.java:10200)
at rx.Observable$ThrowObservable$1.call(Observable.java:10190)
at rx.Observable.subscribe(Observable.java:8407)
at rx.Observable.subscribe(Observable.java:8374)
at rx.Observable.subscribe(Observable.java:8178)
at biz.thomaskeller.rxandroid_21.Main.main(Main.java:10)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
Caused by: rx.exceptions.CompositeException: 2 exceptions occurred.
... 13 more
Caused by: rx.exceptions.CompositeException$CompositeExceptionCausalChain: Chain of Causes for CompositeException In Order Received =>
at rx.exceptions.CompositeException.getCause(CompositeException.java:96)
at java.lang.Throwable.printEnclosedStackTrace(Throwable.java:707)
at java.lang.Throwable.printStackTrace(Throwable.java:667)
at java.lang.Throwable.printStackTrace(Throwable.java:643)
at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:1061)
at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:1052)
at java.lang.Thread.dispatchUncaughtException(Thread.java:1952)
Caused by: java.lang.IllegalArgumentException: illegal argument
at biz.thomaskeller.rxandroid_21.Main.main(Main.java:8)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
Caused by: java.lang.RuntimeException: Duplicate found in causal chain so cropping to prevent loop ...
at rx.exceptions.CompositeException.getCause(CompositeException.java:112)
at java.lang.Throwable.printEnclosedStackTrace(Throwable.java:707)
at java.lang.Throwable.printStackTrace(Throwable.java:667)
at java.lang.Throwable.printStackTrace(Throwable.java:643)
at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:1061)
at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:1052)
at java.lang.Thread.dispatchUncaughtException(Thread.java:1952)
whereas given this:
public class Main {
public static void main(String[] args) {
Observable
.error(new IllegalArgumentException("illegal argument"))
.subscribe(
success -> {},
error -> {
throw new IllegalStateException("illegal state exception"); // Main.java, line 13
}
);
}
}
I see this:
Exception in thread "main" rx.exceptions.OnErrorFailedException: Error occurred when trying to propagate error to Observer.onError
at rx.observers.SafeSubscriber._onError(SafeSubscriber.java:192)
at rx.observers.SafeSubscriber.onError(SafeSubscriber.java:120)
at rx.Observable$ThrowObservable$1.call(Observable.java:10200)
at rx.Observable$ThrowObservable$1.call(Observable.java:10190)
at rx.Observable.subscribe(Observable.java:8407)
at rx.Observable.subscribe(Observable.java:8374)
at rx.Observable.subscribe(Observable.java:8178)
at biz.thomaskeller.rxandroid_21.Main.main(Main.java:10)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
Caused by: rx.exceptions.CompositeException: 2 exceptions occurred.
... 13 more
Caused by: rx.exceptions.CompositeException$CompositeExceptionCausalChain: Chain of Causes for CompositeException In Order Received =>
at rx.exceptions.CompositeException.getCause(CompositeException.java:96)
at java.lang.Throwable.printEnclosedStackTrace(Throwable.java:707)
at java.lang.Throwable.printStackTrace(Throwable.java:667)
at java.lang.Throwable.printStackTrace(Throwable.java:643)
at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:1061)
at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:1052)
at java.lang.Thread.dispatchUncaughtException(Thread.java:1952)
Caused by: java.lang.IllegalArgumentException: illegal argument
at biz.thomaskeller.rxandroid_21.Main.main(Main.java:8)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
Caused by: java.lang.IllegalStateException: illegal state exception
at biz.thomaskeller.rxandroid_21.Main.lambda$main$1(Main.java:13)
at biz.thomaskeller.rxandroid_21.Main$$Lambda$2/664223387.call(Unknown Source)
at rx.Observable$28.onError(Observable.java:8187)
at rx.observers.SafeSubscriber._onError(SafeSubscriber.java:157)
at rx.observers.SafeSubscriber.onError(SafeSubscriber.java:120)
at rx.Observable$ThrowObservable$1.call(Observable.java:10200)
at rx.Observable$ThrowObservable$1.call(Observable.java:10190)
at rx.Observable.subscribe(Observable.java:8407)
at rx.Observable.subscribe(Observable.java:8374)
at rx.Observable.subscribe(Observable.java:8178)
at biz.thomaskeller.rxandroid_21.Main.main(Main.java:10)
... 5 more
from rxandroid.
Hrm... but there seems to be more - because none of my actual crashes point me really at CompositeException.java:112
, where the actual cause is replaced with the pseudo cause that crops the chain, still, I always only see the "upstream" exception.
from rxandroid.
As a note, this seems to be fixed in ReactiveX/RxJava#3977 and included in RxJava version 1.1.6.
from rxandroid.
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
compile 'io.reactivex.rxjava2:rxjava:2.0.1'
from rxandroid.
The issue seems to still be there in rxjava 2.1.12, rxandroid 2.1.0.
No cause is left in crashlytics:
io.reactivex.exceptions.CompositeException: at io.reactivex.internal.observers.ConsumerSingleObserver.onError (ConsumerSingleObserver.java:49) at io.reactivex.internal.operators.single.SingleDoOnSubscribe$DoOnSubscribeSingleObserver.onError (SingleDoOnSubscribe.java:86) at io.reactivex.internal.operators.single.SingleObserveOn$ObserveOnSingleObserver.run (SingleObserveOn.java:79) at io.reactivex.android.schedulers.HandlerScheduler$ScheduledRunnable.run (HandlerScheduler.java:119) at android.os.Handler.handleCallback (Handler.java:873) at android.os.Handler.dispatchMessage (Handler.java:99) at android.os.Looper.loop (Looper.java:214) at android.app.ActivityThread.main (ActivityThread.java:7073) at java.lang.reflect.Method.invoke (Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:493) at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:965)
from rxandroid.
Related Issues (20)
- move from version 2 to version 3 HOT 2
- BUG with gradle 3.6.1 and RxJava and RxAndroid 3.0.0 HOT 2
- RX Android & Release apk HOT 1
- RxAndroid
- HandlerScheduler throws NPE on schedule() in tests HOT 4
- AndroidRuntime: FATAL EXCEPTION -> observeOn(AndroidSchedulers.mainThread()) HOT 5
- Bug or Help Long running observable in background crashes app HOT 1
- [email protected]: Permission denied (publickey). HOT 1
- java.lang.NoSuchMethodError HOT 17
- IllegalAccessError: FlowableDoOnLifecycle: 2.2.3 HOT 1
- docs/content/github/collaborating-with-issues-and-pull-requests/merging-a-pull-request.md
- Gi
- issue with the indirect dependency component reactive-stream License HOT 2
- Does RxAndroid have any plans to release a new version? HOT 1
- Add Sonatype secrets to repo for GitHub Actions usage HOT 9
- RxAndroid 3.0.1 NPE in JVM unit tests HOT 1
- ERROR: Failed to resolve: io.reactivex.rxjava3:rxandroid:3.0.2 HOT 5
- Sms2
- Why the HandlerScheduler class overrides scheduleDirect. It's not more explicit to let the HandlerWorker do the work HOT 4
- Kotlin multiplaform support HOT 2
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from rxandroid.