СоХабр закрыт.

С 13.05.2019 изменения постов больше не отслеживаются, и новые посты не сохраняются.

| сохранено

H Бесконечные потоки с помощью Observable и доказательства в черновиках Recovery Mode

Доброго времени суток друзья. Пишу эту статью сразу после предыдущей только ради того чтобы очистить свое имя, и доказать некоторым codemonkey в комментариях, что код рабочий, и если вы пишите какие либо обвинения, то будьте добры — проверьте их, а то в будущем будете выглядеть смешно, как, к примеру, сейчас.

Был и второй вид комментаторов, считающий, что моя статья, должна быть панацеей. Но так как я явно об этом не написал в предыдущей статье, напишу в этой — это всего лишь пример, вы можете написать свою реализацию как хотите, я всего лишь скромно пишу о идее, а будет ли реализация лучше моей или хуже — это не важно, вы же не обижаетесь на то что примеры из какой нибудь книги по программированию нельзя скопипастить и вставить их в свой проект? Правильно, ведь их задача совсем не в этом. Я уже не говорю о том, что статья была о бесконечных потоках, а не об библиотеке RxJava

Итак, собственно вот ссылка на гит, можете склонировать, собрать apk и проверить сами, cpu в пике чуть больше 3%, сборщик мусора, тоже замечательно делает свою работу, утечек нет, по крайней мере это все на моем устройстве, чтож, проверьте сами, если интересно: git clone Xsinh@bitbucket.org/Defolte/infinitytest.git

Подведем итоги: надеюсь, сейчас я предельно ясно выразил свою мысль, код — всего лишь пример, статья — это повод осмыслить концепцию бесконечных потоков данных, в моем проекте была необходимость поступать похожим образом, а не через фоновые потоки или сервисы, в вашем, наверняка этой необходимости не будет, моя цель была зажечь в вас искорку интереса, чтобы вы сами решили что с ней сделать — погасить, если не нужно, или разжечь пламя идей (тут я подразумеваю, что вы дальше сами найдете информацию в интернете, без моей помощи, если вам это действительно интересно и сделаете свою реализацию, какую только захотите)
–8
~1600

комментарии (17)

–1
mayorovp ,  
Ваш код в репозитории:

```java
while (!subscriber.isUnsubscribed())
subscriber.onNext(hasConnection(context));
```

Ваш код в прошлом посте («пример с отпиской или как нужно делать»):

```java
while (!subscriber.isUnsubscribed())
while (true) subscriber.onNext(i);
```

Вы правда не видите разницы?
0
mayorovp ,  

PS извиняюсь за разметку

–12
Implozia ,   * (был изменён)
ты вообще о чем, может ты пересмотришь предыдущую статью полностью? Там пример, а не реальный код
+1
+2 –1
mayorovp ,  
Так что, если это лишь пример — то можно в нем и ошибки не исправлять уже?
+2
mayorovp ,  

Теперь о том почему ваше доказательство доказательством не является.


Во-первых, вы не используете все возможности, предоставляемые библиотекой RxJava. Нужно начать с того, что заменить явный вызов Handler.post на observeOn. И накидать еще несколько вызовов стандартных методов, чтобы их протестировать.


Во-вторых, использование 3% CPU для такой фигни — это очень много. У меня на стартовом экране системный виджет с 8 подобными индикаторами. Если бы его разработчики следовали вашим советам — он бы потреблял 24% CPU, то есть четверть процессорного времени сжиралась бы на никому не нужные перерисовки!


Теперь по поводу утечек. С чего бы им быть когда в проекте всего один Activity? Утечки могут возникнуть при навигации между разными Activity. Если бы в программе было хотя бы два разных экрана, между которыми можно было ходить туда-сюда — то ее можно было бы использовать для доказательства отсутствия утечек. Но сейчас потенциальные утечки ресурсов при таком подходе не проверяются.

0
DocentTSR ,  
По поводу утечек, чтобы утекла Activity, не обязательно чтоб в проекте было их несколько и между ними происходила навигация. Если вы написали, код который удерживает ссылку на Activity (или View), то при пересоздании Activity, у вас появится новая Activity, но старая не соберется GC. И при каждом пересоздании Activity количество НЕ собранных будет расти.
0
mayorovp ,  
Да, но если просто запустить программу и смотреть на нее — то Activity просто так пересоздаваться не будет. Чтобы проверить программу на утечки — нужен способ «пнуть» пересоздание Activity.
+1
anegin ,  

Смотрите, я прикрутил квадратные колеса к велосипеду. Стало так удобно спускать его по лестнице, я проверил только у себя в подъезде, но думаю будет удобно везде. Вот вам чертеж и концепция — уверен, каждый сможет придумать, что с этим всем делать.

–5
Implozia ,  
Все верно, кроме того, что я сказал, что данный пример будет удобен везде. А что ты предлагаешь, придумать кучу идеальных кейсов на все случаи жизни? Может еще и зарплату за вас получить?
+1
gildor ,  

Концепция прерывания потока или спин для ожидания не является чем то новым и используется повсеместно.
Вас справедливо критикуют, что ваши примеры предлагают плохие не оптимальные решения конкретных проблем (вроде проверки состояния сети), а так же того, что вы использовав RxJava очень странным способом, и уж если использовали можно попытаться сделать намного более нативное решение через кастомный оператор или комбинацию существующих.
И критикуют прежде всего не по причине наличия нерабочего кода, а так как есть опасение, что новички, не разобравшить применят ваш код.

–2
Implozia ,  
Если так, то справедливо, но я исходя из других комментариев — пришел к другому выводу)
–1
Implozia ,   * (был изменён)
Ребят, я тут погосил пожарище, перечитал свою статью, понял что все-таки за мной есть косяки, раз не один человек указывает мне на ошибки, значит на это стоит обратить внимание. Хочу извиниться, учту ваши мнения, когда будет о чем написать в следующий раз.
–5
Implozia ,  
Хотя это и не отменяет тот факт, что мне испортили карму обиженные codemonkeys(
0
virtustilus ,  
Правила habrahabr никто не отменял, и работают они на каждом Вашем комментарии (даже если уж очень хочется выплеснуть все эмоции в этот момент).
–1
Implozia ,  
Я писал не ради кармы, но признаться не ожидал своей реакции, дело не в том, что я не прав, я еще сам не понял так ли это, но на мой взгляд — по делу было очень мало комментариев, никто не захотел проверить примеры, а кто-то просто скопипастил код, наверняка не добавив зависимости к проекту, и поэтому он не запустился, и начали писать — не рабочий код, create() мол бред, надо observeOn() и прочую ерунду, причем не зная для чего каждый из методов нужен, и когда его надо применять, в какой ситуации.
+1
virtustilus ,   * (был изменён)
Я вот не понимаю, почему Вы до сих пор не отредактировали код в своем посте?
Там же Ваш текст не соответствует коду.
У вас вот эта часть кода:
while (!subscriber.isUnsubscribed())
while (true) subscriber.onNext(i);
i = i.add(ONE);

А теперь подробнее — что же происходит в первом и втором случае? В первом случае, рекурсия блокирует поток, по скольку вычисления никогда не кончится, и вы сами, наверняка, догадываетесь к чему это приведет. Поэтому, создадим явную конкурентность. Во втором примере мы создаем отдельный поток и будем делать события в нем.


Во втором случае у Вас такой же бесконечный поток. То есть люди читают этот код и думают «а зачем он добавил while (!subscriber.isUnsubscribed()), если код while (true) subscriber.onNext(i); все равно бесконечен и проверка не будет срабатывать более одного раза в момент старта?»
Вот и минусуют, т.к. код не подходит по качество постов на этом ресурсе. Разберитесь с чем-то сложным, напишите правильный код сюда, сделайте описание короткое или длинное и пост наберет плюсы в карму.
0
Implozia ,  
Я вас услышал, перепроверю это еще раз, как только появится время, но ответ на этот вопрос я только что написал в другом посте, в комментариях