<?xml version="1.0" encoding="UTF-8"?>

<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" >

  <channel>
    <title><![CDATA[Комментарии / Профиль dmdev]]></title>
    <link>https://habr.com/ru/users/dmdev/comments/</link>
    <description><![CDATA[Хабр: комментарии пользователя dmdev]]></description>
    <language>ru</language>
    <managingEditor>editor@habr.com</managingEditor>
    <generator>habr.com</generator>
    <pubDate>Tue, 28 Apr 2026 22:13:33 GMT</pubDate>
    
    
      <image>
        <link>https://habr.com/ru/</link>
        <url>https://habrastorage.org/webt/ym/el/wk/ymelwk3zy1gawz4nkejl_-ammtc.png</url>
        <title>Хабр</title>
      </image>
    

    
      

      
        
  
    <item>
      <title>06.05.2023 13:41:26 </title>
      <guid isPermaLink="true">https://habr.com/ru/posts/733694/#comment_25522156</guid>
      <link>https://habr.com/ru/posts/733694/#comment_25522156</link>
      <description><![CDATA[<p>Например, если нужно открыть доступ к свойству или методу не всем подряд (public), а только классам, которые реализуют некоторый контракт.</p><p>А какой профит дружественных классов в С++?)</p>]]></description>
      <pubDate>Sat, 06 May 2023 13:41:26 GMT</pubDate>
      <dc:creator><![CDATA[]]></dc:creator>
    </item>
  

  
    <item>
      <title>13.05.2020 10:00:22 </title>
      <guid isPermaLink="true">https://habr.com/ru/companies/funcorp/articles/500980/#comment_21609882</guid>
      <link>https://habr.com/ru/companies/funcorp/articles/500980/#comment_21609882</link>
      <description><![CDATA[Попробуйте <a href="https://github.com/dmdevgo/RxPM">RxPM</a>]]></description>
      <pubDate>Wed, 13 May 2020 10:00:22 GMT</pubDate>
      <dc:creator><![CDATA[]]></dc:creator>
    </item>
  

  
    <item>
      <title>30.09.2019 20:03:14 </title>
      <guid isPermaLink="true">https://habr.com/ru/articles/452628/#comment_20693991</guid>
      <link>https://habr.com/ru/articles/452628/#comment_20693991</link>
      <description><![CDATA[В новом <a href="https://developer.android.com/reference/com/google/android/material/bottomsheet/BottomSheetBehavior.html">BottomSheetBehavior</a> появился флаг <a href="https://developer.android.com/reference/com/google/android/material/bottomsheet/BottomSheetBehavior.html#setfittocontents"> setFitToContents </a> для этого]]></description>
      <pubDate>Mon, 30 Sep 2019 20:03:14 GMT</pubDate>
      <dc:creator><![CDATA[]]></dc:creator>
    </item>
  

  
    <item>
      <title>19.02.2019 11:40:27 </title>
      <guid isPermaLink="true">https://habr.com/ru/articles/439926/#comment_19774304</guid>
      <link>https://habr.com/ru/articles/439926/#comment_19774304</link>
      <description><![CDATA[Ну тут они советуют использовать родные ретейн фрагменты, которые появились начиная с HONEYCOMB (версия 3.0-3.2). Но если посмотреть исходники внимательно, то можно увидеть, что родные и саппорт фрагменты хранятся и передаются через NonConfigurationInstances, аналогично и лоадеры. <br>
А вот второе замечание интересное, что onRetainNonConfigurationInstance может в каки-то случаях не вызваться. Но что-то мне подсказывает на практике это никогда не случается. Иначе на ретейн фрагменты тоже нельзя полагаться.]]></description>
      <pubDate>Tue, 19 Feb 2019 11:40:27 GMT</pubDate>
      <dc:creator><![CDATA[]]></dc:creator>
    </item>
  

  
    <item>
      <title>18.02.2019 16:33:02 </title>
      <guid isPermaLink="true">https://habr.com/ru/articles/439926/#comment_19771264</guid>
      <link>https://habr.com/ru/articles/439926/#comment_19771264</link>
      <description><![CDATA[<blockquote>Из минусов — не работает до 4 андроида, там придется по старинке через retain фрагмент.</blockquote><p><a href="https://developer.android.com/reference/android/app/Activity.html#getLastNonConfigurationInstance()">getLastNonConfigurationInstance</a> доступен с первой версии API</p>]]></description>
      <pubDate>Mon, 18 Feb 2019 16:33:02 GMT</pubDate>
      <dc:creator><![CDATA[]]></dc:creator>
    </item>
  

  
    <item>
      <title>16.02.2019 15:20:33 </title>
      <guid isPermaLink="true">https://habr.com/ru/companies/mobileup/articles/440284/#comment_19764856</guid>
      <link>https://habr.com/ru/companies/mobileup/articles/440284/#comment_19764856</link>
      <description><![CDATA[<p>Для фрагментов в бэкстеке ваш способ не пройдет, у них дестроится вью при реплейсе. И придется восстанавливать стейт.</p>]]></description>
      <pubDate>Sat, 16 Feb 2019 15:20:33 GMT</pubDate>
      <dc:creator><![CDATA[]]></dc:creator>
    </item>
  

  
    <item>
      <title>30.01.2019 14:15:11 </title>
      <guid isPermaLink="true">https://habr.com/ru/companies/jugru/articles/437948/#comment_19682986</guid>
      <link>https://habr.com/ru/companies/jugru/articles/437948/#comment_19682986</link>
      <description><![CDATA[<p>Добавлю что LiveData внутри завязана на Handler, и как прогонять unit-тесты?<br>
Самое неприятное, что теперь решение ViewModel + LiveData считается де-факто стандартом. Большинство доверяют только Гуглу и смотреть в сторону намного лучших MV*-решений даже не хотят. Тот же PM или MVVM несложно <a href="http://habr.com/ru/company/mobileup/blog/342850/">реализовать</a> на RxJava.</p>]]></description>
      <pubDate>Wed, 30 Jan 2019 14:15:11 GMT</pubDate>
      <dc:creator><![CDATA[]]></dc:creator>
    </item>
  

  
    <item>
      <title>19.10.2018 12:46:57 </title>
      <guid isPermaLink="true">https://habr.com/ru/companies/redmadrobot/articles/426617/#comment_19255971</guid>
      <link>https://habr.com/ru/companies/redmadrobot/articles/426617/#comment_19255971</link>
      <description><![CDATA[<p><a href="https://github.com/bluelinelabs/Conductor">Conductor</a> вам в помощь</p>]]></description>
      <pubDate>Fri, 19 Oct 2018 12:46:57 GMT</pubDate>
      <dc:creator><![CDATA[]]></dc:creator>
    </item>
  

  
    <item>
      <title>19.10.2018 12:46:34 </title>
      <guid isPermaLink="true">https://habr.com/ru/companies/redmadrobot/articles/426617/#comment_19255969</guid>
      <link>https://habr.com/ru/companies/redmadrobot/articles/426617/#comment_19255969</link>
      <description><![CDATA[<p>Удивительно, что кто-то еще не пишет приложения в Single-Activity. В любой момент может потребоваться поместить экран в NavigationDrawer, ViewPager или BottomBar. В этом случае без кучи фрагментов в одной Activity не обойтись.</p>]]></description>
      <pubDate>Fri, 19 Oct 2018 12:46:34 GMT</pubDate>
      <dc:creator><![CDATA[]]></dc:creator>
    </item>
  

  
    <item>
      <title>30.08.2018 13:55:21 </title>
      <guid isPermaLink="true">https://habr.com/ru/articles/421739/#comment_19052525</guid>
      <link>https://habr.com/ru/articles/421739/#comment_19052525</link>
      <description><![CDATA[<p>В RxJava для этих целей есть <a href="https://github.com/ReactiveX/RxJava/wiki/Connectable-Observable-Operators">Connectable Observable</a> и <a href="http://reactivex.io/documentation/subject.html">Subject</a></p>]]></description>
      <pubDate>Thu, 30 Aug 2018 13:55:21 GMT</pubDate>
      <dc:creator><![CDATA[]]></dc:creator>
    </item>
  

  
    <item>
      <title>30.08.2018 13:54:53 </title>
      <guid isPermaLink="true">https://habr.com/ru/articles/421739/#comment_19052519</guid>
      <link>https://habr.com/ru/articles/421739/#comment_19052519</link>
      <description><![CDATA[<p>Что насчет <strong>combineLatest</strong> ?</p>]]></description>
      <pubDate>Thu, 30 Aug 2018 13:54:53 GMT</pubDate>
      <dc:creator><![CDATA[]]></dc:creator>
    </item>
  

  
    <item>
      <title>22.11.2017 14:32:09 </title>
      <guid isPermaLink="true">https://habr.com/ru/companies/mobileup/articles/342850/#comment_10533362</guid>
      <link>https://habr.com/ru/companies/mobileup/articles/342850/#comment_10533362</link>
      <description><![CDATA[<p>все картинки сделаны в Sketch</p>]]></description>
      <pubDate>Wed, 22 Nov 2017 14:32:09 GMT</pubDate>
      <dc:creator><![CDATA[]]></dc:creator>
    </item>
  

  
    <item>
      <title>07.11.2017 09:04:59 </title>
      <guid isPermaLink="true">https://habr.com/ru/companies/redmadrobot/articles/341108/#comment_10508970</guid>
      <link>https://habr.com/ru/companies/redmadrobot/articles/341108/#comment_10508970</link>
      <description><![CDATA[<p>Можете привести пример из жизни, когда стандартными стратегиями не обойтись?</p>]]></description>
      <pubDate>Tue, 07 Nov 2017 09:04:59 GMT</pubDate>
      <dc:creator><![CDATA[]]></dc:creator>
    </item>
  

  
    <item>
      <title>26.04.2017 10:36:15 </title>
      <guid isPermaLink="true">https://habr.com/ru/companies/mobileup/articles/327416/#comment_10191892</guid>
      <link>https://habr.com/ru/companies/mobileup/articles/327416/#comment_10191892</link>
      <description><![CDATA[<p>Их много — значит <strong>они</strong></p>]]></description>
      <pubDate>Wed, 26 Apr 2017 10:36:15 GMT</pubDate>
      <dc:creator><![CDATA[]]></dc:creator>
    </item>
  

  
    <item>
      <title>26.04.2017 09:07:09 </title>
      <guid isPermaLink="true">https://habr.com/ru/companies/mobileup/articles/326962/#comment_10191700</guid>
      <link>https://habr.com/ru/companies/mobileup/articles/326962/#comment_10191700</link>
      <description><![CDATA[<p>Точно так же как и в <a href="https://github.com/Arello-Mobile/Moxy">Moxy</a> <em>;)</em></p><br/>
<p>Рестарт процесса вещь неприятная, но не всегда требуется при этом восстанавливать View в то же самое состояние. Так как данные за время отсутствия пользователя в приложении могли устареть. Все зависит от конкретного приложения и в каждом случае нужно то или иное решение:</p><br/>
<p>1) Точно восстановится бэкстек из активити и фрагментов. При желании этот момент можно отследить и очистить бекстек, если приложение стартовало с восстановлением.</p><br/>
<p>2) Самые важные параметры экранов (параметры запуска) мы стараемся передавать через Intent или аргументы фрагмента, например id сущностей, которые нужно отобразить. PresentationModel получает их в конструкторе, так как View провайдит ее.</p><br/>
<p>3) Не все состояния нужно восстанавливать. Например прогресс загрузки не нужно восстанавливать, так как с убийством процесса все асинхронные запросы (в том числе и в сеть) тоже завершатся.</p><br/>
<p>4) Есть данные, которые быстро устаревают, например какие-нибудь статусы заказа. Лучше будет их заново запросить с сервера.</p><br/>
<p>5) Некоторые данные следует восстанавливать даже после принудительного завершения приложения. В этом случае никакие bundle нам не помогут. Например это может быть корзина с продуктами. Такие данные во время работы приложения нужно сохранять на диск (в бд или файл).</p><br/>
<p>6) Хорошо кешировать данные, которые не сильно теряют актуальность за относительно продолжительное время.</p><br/>
<p>7) Можно запустить сервис, чтобы повысить приоритет приложения в фоне. Тем самым снизить вероятность убийства процесса системой.</p><br/>
<p>8) В конце концов в PresentationModel можно пробрасывать вызовы сохранения/восстановления состояния из bundle. Но этот вариант не подходит для персистентных данных (пункт 5 и 6).</p>]]></description>
      <pubDate>Wed, 26 Apr 2017 09:07:09 GMT</pubDate>
      <dc:creator><![CDATA[]]></dc:creator>
    </item>
  

  
    <item>
      <title>26.04.2017 09:06:26 </title>
      <guid isPermaLink="true">https://habr.com/ru/companies/mobileup/articles/326962/#comment_10191698</guid>
      <link>https://habr.com/ru/companies/mobileup/articles/326962/#comment_10191698</link>
      <description><![CDATA[<p>.</p>]]></description>
      <pubDate>Wed, 26 Apr 2017 09:06:26 GMT</pubDate>
      <dc:creator><![CDATA[]]></dc:creator>
    </item>
  

  
    <item>
      <title>23.04.2017 11:19:55 </title>
      <guid isPermaLink="true">https://habr.com/ru/companies/mobileup/articles/326962/#comment_10187224</guid>
      <link>https://habr.com/ru/companies/mobileup/articles/326962/#comment_10187224</link>
      <description><![CDATA[<p>Основная идея паттерна PM заключается в том, что стейт хранится в PresentationModel. View не нужно об этом беспокоиться и не нужно складывать стейт в Bundle. Главное реализовать хранение PresentationModel во время поворота.</p><br/>
<p>По поводу навигации, нужно складывать команды в буфер, и воспроизводить их когда навигатор (активити) будет готов. Посмотрите как это сделано в <a href="https://github.com/terrakok/Cicerone">Cicerone</a>.</p>]]></description>
      <pubDate>Sun, 23 Apr 2017 11:19:55 GMT</pubDate>
      <dc:creator><![CDATA[]]></dc:creator>
    </item>
  

  
    <item>
      <title>22.04.2017 17:59:49 </title>
      <guid isPermaLink="true">https://habr.com/ru/companies/mobileup/articles/326962/#comment_10186482</guid>
      <link>https://habr.com/ru/companies/mobileup/articles/326962/#comment_10186482</link>
      <description><![CDATA[<ol>
<li>Не все пишут на Котлине, можно делать интерфейс-заглушку, но ее тоже придется генерировать. Но проблема не в этом. Так как вьюха может быт отсоединена, то приходится сохранять стейт в презентере в виде флагов, чтобы потом его воспроизвести при атаче вью.</li>
<li>По поводу тестирования RxJava, есть хороший доклад на эту тему: <a href="https://www.youtube.com/watch?v=7W5NwpE5WpQ&amp;feature=youtu.be">https://www.youtube.com/watch?v=7W5NwpE5WpQ&feature=youtu.be</a></li>
<li>Ретейн фрагмент только для семпла, так то для прода они не годятся. Как вы уже заметили в бекстеке такие фрагменты нельзя использовать и есть баги с чайлд-фрагментами. Я в своих приложениях использую <a href="https://github.com/bluelinelabs/Conductor">Conductor</a> — это такие &quot;правильные&quot; фрагменты, которые не умирают в бекстеке и при поворотах. А насчет памяти тут все в порядке, на onDestroyView мы отписываемся от PresentationModel.</li>
</ol>]]></description>
      <pubDate>Sat, 22 Apr 2017 17:59:49 GMT</pubDate>
      <dc:creator><![CDATA[]]></dc:creator>
    </item>
  

  
    <item>
      <title>21.04.2017 10:55:14 </title>
      <guid isPermaLink="true">https://habr.com/ru/companies/mobileup/articles/326962/#comment_10184786</guid>
      <link>https://habr.com/ru/companies/mobileup/articles/326962/#comment_10184786</link>
      <description><![CDATA[<p>Все ошибки можно разделить на два типа:<br/>
1) Ошибки, которые нужно показать один раз, например AlertDialog или Toast. В этом случае ошибка будет эвентом, ее сохранять не нужно. Для этого подойдет обычный <strong>PublishRelay</strong>. Но будет проблема, если ошибка прилетит в тот момент, когда вьюха отсоединена от PresentationModel. В этом случае мы потеряем этот эвент. Как решать эту проблему я расскажу в следующей статье.</p><br/>
<p>2) Ошибки, которые нужно показывать как заглушку в разметке, например с кнопкой &quot;Retry&quot;, такой вариант нужно считать стейтом. Для этого нужно использовать <strong>BehaviorRelay</strong>. </p>]]></description>
      <pubDate>Fri, 21 Apr 2017 10:55:14 GMT</pubDate>
      <dc:creator><![CDATA[]]></dc:creator>
    </item>
  

  
    <item>
      <title>21.04.2017 09:38:06 </title>
      <guid isPermaLink="true">https://habr.com/ru/companies/mobileup/articles/326962/#comment_10184672</guid>
      <link>https://habr.com/ru/companies/mobileup/articles/326962/#comment_10184672</link>
      <description><![CDATA[<p>Залил примерчик на гитхаб <a href="https://github.com/dmdevgo/RxPM-Demo">https://github.com/dmdevgo/RxPM-Demo</a></p>]]></description>
      <pubDate>Fri, 21 Apr 2017 09:38:06 GMT</pubDate>
      <dc:creator><![CDATA[]]></dc:creator>
    </item>
  

      

      

    
  </channel>
</rss>
