android - Observable.groupBy() limit on count of input data? -
i have following 2 classes , function:
public static class shop { public int id; public string name; public list<coordinate> coordinates = new arraylist<>(); @override public string tostring() { string str = id + " (" + name + ") [ "; (coordinate coordinate : coordinates) { str += (coordinate.tostring() + " "); } str += "]"; return str; } } public static class coordinate { public string latitude; public string longitude; public coordinate(string latitude, string longitude) { this.latitude = latitude; this.longitude = longitude; } @override public string tostring() { return "{" + latitude + ", " + longitude + "}"; } } public list<string[]> longtimefunc() { try { //simulate load thread.sleep(1000); } catch (interruptedexception ignore) { } log.d("rx_tag_long_load", thread.currentthread().getname()); return arrays.aslist( new string[] {"1", "foo", "lat1-1", "long1-1"}, new string[] {"1", "foo", "lat1-2", "long1-2"}, new string[] {"2", "bar", "lat2-1", "long2-1"}, new string[] {"1", "foo", "lat1-3", "long1-3"}, new string[] {"1", "foo", "lat1-4", "long1-4"}, new string[] {"3", "ping", "lat3-1", "long3-1"}, new string[] {"2", "bar", "lat2-2", "long2-2"}, new string[] {"1", "foo", "lat1-5", "long1-5"}, new string[] {"2", "bar", "lat2-3", "long2-3"}, new string[] {"2", "bar", "lat2-4", "long2-4"}, new string[] {"1", "foo", "lat1-6", "long1-6"}, new string[] {"1", "foo", "lat1-7", "long1-7"}, new string[] {"3", "ping", "lat3-2", "long3-2"}, new string[] {"3", "ping", "lat3-3", "long3-3"}, new string[] {"2", "bar", "lat2-5", "long2-5"}, new string[] {"3", "ping", "lat3-4", "long3-4"}, new string[] {"2", "bar", "lat2-6", "long2-6"}, new string[] {"3", "ping", "lat3-5", "long3-5"}, new string[] {"2", "bar", "lat2-7", "long2-7"}, new string[] {"2", "bar", "lat2-8", "long2-8"}, new string[] {"3", "ping", "lat3-6", "long3-6"}, new string[] {"2", "bar", "lat2-9", "long2-9"}, new string[] {"3", "ping", "lat3-7", "long3-7"}, new string[] {"2", "bar", "lat2-10", "long2-10"}, new string[] {"2", "bar", "lat2-11", "long2-11"}, new string[] {"4", "dev", "lat4-1", "long4-1"}, new string[] {"4", "dev", "lat4-2", "long4-2"}, new string[] {"4", "dev", "lat4-3", "long4-3"}, new string[] {"4", "dev", "lat4-4", "long4-4"}, new string[] {"4", "dev", "lat4-5", "long4-5"} ); } i want group source first element of each row , collect them list<shop>:
observable .defer(() -> observable.from(longtimefunc())) .doonnext(strings -> log.d("rx_tag_first", arrays.tostring(strings))) .groupby(rows -> rows[0]) .doonnext(groupedobservable -> log.d("rx_tag_two", groupedobservable.getkey())) .concatmap(group -> group.collect(shop::new, (shop, rows) -> { shop.id = integer.parseint(rows[0]); shop.name = rows[1]; shop.coordinates.add(new coordinate(rows[2], rows[3])); })) .doonnext(shop -> log.d("rx_tag_three", string.valueof(shop))) .tolist() .doonnext(shops -> log.d("rx_tag_four", thread.currentthread().getname())) .subscribeon(schedulers.newthread()) .observeon(androidschedulers.mainthread()) .subscribe(shops -> log.d("rx_tag_subscribe", string.valueof(shops))); log.d("rx_tag", "after subscribe"); the output looks (notice absence of rx_tag_subscribe log record , of elements @ end):
rx_tag: after subscribe rx_tag_long_load: rxnewthreadscheduler-1 rx_tag_first: [1, foo, lat1-1, long1-1] rx_tag_two: 1 rx_tag_first: [1, foo, lat1-2, long1-2] rx_tag_first: [2, bar, lat2-1, long2-1] rx_tag_two: 2 rx_tag_first: [1, foo, lat1-3, long1-3] rx_tag_first: [1, foo, lat1-4, long1-4] rx_tag_first: [3, ping, lat3-1, long3-1] rx_tag_two: 3 rx_tag_first: [2, bar, lat2-2, long2-2] rx_tag_first: [1, foo, lat1-5, long1-5] rx_tag_first: [2, bar, lat2-3, long2-3] rx_tag_first: [2, bar, lat2-4, long2-4] rx_tag_first: [1, foo, lat1-6, long1-6] rx_tag_first: [1, foo, lat1-7, long1-7] rx_tag_first: [3, ping, lat3-2, long3-2] rx_tag_first: [3, ping, lat3-3, long3-3] rx_tag_first: [2, bar, lat2-5, long2-5] rx_tag_first: [3, ping, lat3-4, long3-4] rx_tag_first: [2, bar, lat2-6, long2-6] rx_tag_first: [3, ping, lat3-5, long3-5] rx_tag_first: [2, bar, lat2-7, long2-7] rx_tag_first: [2, bar, lat2-8, long2-8] rx_tag_first: [3, ping, lat3-6, long3-6] rx_tag_first: [2, bar, lat2-9, long2-9] rx_tag_first: [3, ping, lat3-7, long3-7] rx_tag_first: [2, bar, lat2-10, long2-10] rx_tag_first: [2, bar, lat2-11, long2-11] rx_tag_first: [4, dev, lat4-1, long4-1] i looks operator hangs , waits infinitely source sequence complete. if comment out 4th group in source data works expected , final part of log looks this:
rx_tag_three: 1 (foo) [ {lat1-1, long1-1} {lat1-2, long1-2} {lat1-3, long1-3} {lat1-4, long1-4} {lat1-5, long1-5} {lat1-6, long1-6} {lat1-7, long1-7} ] rx_tag_three: 2 (bar) [ {lat2-1, long2-1} {lat2-2, long2-2} {lat2-3, long2-3} {lat2-4, long2-4} {lat2-5, long2-5} {lat2-6, long2-6} {lat2-7, long2-7} {lat2-8, long2-8} {lat2-9, long2-9} {lat2-10, long2-10} {lat2-11, long2-11} ] rx_tag_three: 3 (ping) [ {lat3-1, long3-1} {lat3-2, long3-2} {lat3-3, long3-3} {lat3-4, long3-4} {lat3-5, long3-5} {lat3-6, long3-6} {lat3-7, long3-7} ] rx_tag_four: rxnewthreadscheduler-1 rx_tag_subscribe: [1 (foo) [ {lat1-1, long1-1} {lat1-2, long1-2} {lat1-3, long1-3} {lat1-4, long1-4} {lat1-5, long1-5} {lat1-6, long1-6} {lat1-7, long1-7} ], 2 (bar) [ {lat2-1, long2-1} {lat2-2, long2-2} {lat2-3, long2-3} {lat2-4, long2-4} {lat2-5, long2-5} {lat2-6, long2-6} {lat2-7, long2-7} {lat2-8, long2-8} {lat2-9, long2-9} {lat2-10, long2-10} {lat2-11, long2-11} ], 3 (ping) [ {lat3-1, long3-1} {lat3-2, long3-2} {lat3-3, long3-3} {lat3-4, long3-4} {lat3-5, long3-5} {lat3-6, long3-6} {lat3-7, long3-7} ]] what do wrong?
Comments
Post a Comment