• Android. Как бороться с подобными утечками памяти?

    @DocentTSR
    Android Dev
    Сергей,

    1. у фрагментов с выставленным setRetainInstance(true) - не должно быть интерфейса/вьюх вообще! Об этом написано в документаци, черным по белому. Это и является вашей утечкой.
    дополнительно: И в бэкстек его класть тоже нельзя!

    2. любой анонимный/внутренний не статичесикй класс - имеет не явную ссылку на внешний!

    3.
    - в методе onCreate у фрагмента особо делать ничего не нужно.
    - в методе onCreateView нужно создавать тока вьюху, ну или еще такие мелкие операции как setHasOptionsMenu.
    - вся основная логика делается в onViewCreated, уже после того как фрагмент приаттачился и создал все вьюхи.

    4. на будущее, любой листенер вы можете занулить в методе
    onDestroy - Activity
    onDestroyView - Fragment

    например
    adapter.setOnItemClickListener(null)

    и важно это делать ДО супер метода!

    5. По опыту говорю, все вот эти LeakCanary это для ленивых хипстеров.
    Нормальная тулза которая точно вам скажет, что течет, как сильно, и самое главное КТО удерживает эту ссылку покажет - MAT (Memory Analyser Tool) в связке с DDMS, не поленитесь разобраться, на хабре есть кучу статей.
    Ответ написан
    5 комментариев
  • Насколько оправдано использование Guava?

    Очень удобная библиотека.
    Использую Cache, MultiMap, коллекции.
    Чем велосипедить что-то свое, лучше взять готовое и проверенное.
    Ответ написан
    Комментировать
  • Немного о правильности написания кода. Какой вариант выбрать?

    @Tiberal
    то, что предложили хуже

    isRequested() = false -> 3 раза дернется if

    в вашем случае один раз

    ну и второй вариант плохочитаем

    если совсем много вложений switch в помощь
    Ответ написан
    2 комментария
  • Немного о правильности написания кода. Какой вариант выбрать?

    artemgapchenko
    @artemgapchenko
    Много уровней вложенности плохо читаются. Попробуйте добавить внутрь условия

    if (rulesField.isChecked()) {
        register(numberField.getText().toString(), codeField.getText().toString());
    }

    Ещё парочку вложенных if-else, чтобы получилось вот такое:

    @Override
        public void onButtonClick() {
            if (isRequested()) {
                if (rulesField.isChecked()) {
                        if (canProceed()) {
                             register(numberField.getText().toString(), codeField.getText().toString());
                        } else if (isExtraRequestRequired()) {
                            doSomething();
                         } else if (oneMoreCondition()) {
                             doSmomethingOnExtraCondition();
                         } else {
                              Log.e("Unexpected condition");
                         }
                } else {
                    showMessage(R.string.error_rules);
                }
            } else {
                requestRegister(numberField.getText().toString());
            }
        }

    и вы поймёте, что удерживать в голове ту ветку, которая вам интересна (сначала if, потом вложенный в него else, потом второй if-else из вложенных в else первого if'а) становится решительно невозможно. Поэтому и стараются так структурировать код, чтобы он был "плоским", то есть без вложенности. Это, конечно идеал, и иногда труднодостижимый, но стремиться к нему стоит - человек, который после вас будет читать ваш листинг (а чаще всего это будете вы сами недели через две после того, как вы его написали, и успешно забыли всю структуру), скажет вам спасибо.
    Ответ написан
    2 комментария
  • Заказчик просит отрисовать все состояния экрана (выпадающее меню и тд) Это будут уже новые экраны или засчитывается как один экран?

    webirus
    @webirus
    Тыжверстальщик! Наверстай мне упущенное...
    Хороший дизайнер ОБЯЗАН предоставить бесплатно все макеты состояний сайта, приложения.
    Открытые меню, всплывающие окна, разворачивающиеся списки и так далее.
    Даже ховер на ссылках и кнопках нужно обязательно предоставить.
    Должно быть 2 исходника (в идеале), но можно и в одном скрытыми слоями (тогда нужно сопроводительное письмо).
    Придумывать, как всё это открывается, закрывается, скрывается - работа дизайнера.
    Дизайнер должен сразу учитывать это и оценивать в стоимости проекта заранее.
    Ответ написан
    Комментировать
  • Заказчик просит отрисовать все состояния экрана (выпадающее меню и тд) Это будут уже новые экраны или засчитывается как один экран?

    Ankhena
    @Ankhena
    Нежно люблю верстку
    Логично, что рисуя экран, на котором элементы могут иметь разные состояния должны их либо нарисовать либо описать в сопроводительной записке.
    Ответ написан
    Комментировать
  • Как открыть файл в другом приложении на андроид?

    a13xsus
    @a13xsus
    Lazy developer
    Для API < 24:

    Мне нужно решить такую проблему: хочу, чтобы из моего приложения я мог передавать любой файл в другое приложение, которое сможет его открыть

    Uri fileUri = Uri.fromFile(new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) + "/alpha_stmoritz_train.jpg"));
    Intent intent = new Intent(Intent.ACTION_SEND);
    intent.putExtra(Intent.EXTRA_STREAM, fileUri);
    intent.setType("image/*");
    intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);
    startActivity(Intent.createChooser(intent, "Share Image:"));


    К примеру, открыть фото в галерее. Как это сделать?

    Uri fileUri = Uri.fromFile(new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) +
                    "/alpha_stmoritz_train.jpg"));
    Intent intent = new Intent();
    intent.setAction(Intent.ACTION_VIEW);
    intent.setDataAndType(fileUri, "image/*");
    intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);
    startActivity(intent);


    Для Andorid 7 Nougat (API >=24) необходимо использовать FileProvider, т.к. Uri.fromFile() будет вызывать FileUriExposedException.

    1. В AndroidManifest.xml добавляем:
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

    и после активити тега:
    <provider
                android:name="android.support.v4.content.FileProvider"
                android:authorities="${applicationId}.provider"
                android:exported="false"
                android:grantUriPermissions="true">
                <meta-data
                    android:name="android.support.FILE_PROVIDER_PATHS"
                    android:resource="@xml/provider_paths"/>
            </provider>


    2. Создаем xml/provider_paths:
    <?xml version="1.0" encoding="utf-8"?>
    <paths xmlns:android="http://schemas.android.com/apk/res/android">
        <root-path name="root" path="." />
    </paths>


    3. Обязательно даем разрешения на Storage для нашего приложения в настройках приложения (либо пишем код, который их будет спрашивать).

    4. Пишем Intent:
    String localUri = "/storage/emulated/0/Pictures/alpha_stmoritz_train.jpg"; //тут уже как хотите так и формируйте путь, хоть через Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) + имя файла
    File file = new File(localUri);        
    Uri contentUri = FileProvider.getUriForFile(this, this.getApplicationContext().getPackageName() + ".provider", file);
    Intent openFileIntent = new Intent(Intent.ACTION_VIEW);
    openFileIntent.setDataAndTypeAndNormalize(contentUri, "image/*");
    openFileIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);
    startActivity(openFileIntent);


    5. Для поддержки ранних версий API можно написать что-то типа
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
          ...
    } else {
          ...
    }
    Ответ написан
  • Какой сервер выбрать по указанным требованиям?

    Jump
    @Jump Куратор тега Windows
    Системный администратор со стажем.
    Поскольку нагрузка неизвестна сказать нечего.
    А вообще сейчас такие вещи умные люди не покупают, а берут в аренду в облаке.
    Если ресурсов не хватает - докупают.
    И все работает.
    А уж когда они четко видят какая нагрузка и сколько ресурсов расходется, они считают что выгоднее купить или арендовать.
    И уже с готовым расчетом идут в магазин и четко говорят требуемую конфигурацию.

    Берите в аренду, настраивайте и проверяйте. Если ресурсов не хватает переходите на более дорогой тариф.
    Как только быстродействие и производительность устроит - идите в магазин за конкретным сервером, с четкими данными.
    Переносите на новый сервер конфигурацию и работаете, а от аренды отказываетесь.
    Все легко и просто.
    Ответ написан
    5 комментариев
  • Как на Vue сделать динамическое добавление полей?

    sfi0zy
    @sfi0zy
    Creative frontend developer
    Поскольку вопрос абстрактный (только шайтан знает как вы организовали у себя разделение на компоненты, какое хранилище и.т.д), то ответ будет таким же - codepen. Но общую идею понять можно.
    Ответ написан
    2 комментария
  • Стоит ли заключать договор?

    @entermix
    Кто сталкивался с такими ситуациями? Кто какие решения принимал? Всё-таки не очень-то хочется обогащать чужой карман...

    Пойду откажусь от всех текущих проектов, а то, вдруг, они начнут приносить прибыль моим клиентам? Ужасно, тчк.
    Ответ написан
    Комментировать
  • Dagger 2. В каких случаях происходит пересоздание объекта @Singleton?

    zagayevskiy
    @zagayevskiy Куратор тега Android
    Android developer at Yandex
    Нужен код, когда вы создаёте компонент и когда инжектите активити. Если он пересоздаётся в такой ситуации - значит вы инжектите несколько раз, при этом используя разные инстансы компонента.
    Ответ написан
  • Как выкачать сайт с видео?

    JustinBieber
    @JustinBieber
    Звизда
    дай доступ выкачаем вместе )
    Ответ написан
    Комментировать
  • Какую бд использовать для приложения на android?

    zagayevskiy
    @zagayevskiy Куратор тега Android
    Android developer at Yandex
    SQLite + StoreIO (человеческий интерфейс к SQLite). Сам файл бд не стоит синкать, синкайте данные.
    Или используйте Realm, там для синхронизации всё хорошо продумано.
    Ответ написан
    Комментировать
  • Как проектируются БД для таких сайтов?

    ThunderCat
    @ThunderCat
    {PHP, MySql, HTML, JS, CSS} developer
    Как проектируются БД для таких сайтов?

    1) Четкие названия для каждого поля, на английском (это стандарт, не ленитесь заглянуть в гугл транслейт для перевода, и сами английский подтянете, и выглядит профессионально, за код не стыдно и тд)
    2) В полях где можно сделать ограниченное количество вариантов ставится поле типа int и к этому полю связанная таблица справочник. Так по этим полям будет легче и быстрее делаться выборка в случае поиска по фильтру.
    3) Varchar используется только там где пользователь вводит что-либо "от руки", в остальных случаях это практически всегда связь со справочной таблицей, в которой перечислены возможные значения.

    Что касается еластиксерча, это механизм поиска в текстовых полях, мощный и удобный, но в данном случае избыточный, просто надо нормально спроектировать. Это все равно что сделать кривой медленный код и потом вешать кэширование чтобы хоть как то работало на приемлемой скорости. Типа, "лыжи по асфальту не едут, давайте лыжнику в ж... вставим ракету помощнее!".
    Ответ написан
    Комментировать
  • Почему единицы измерения разрешений экранов мониторов и смартфонов разные?

    @Mercury13
    Программист на «си с крестами» и не только
    > но этот экран в 10 раз меньше экрана моего ноутбука
    Если только по площади — если пропорции сходные, 15" больше 5,5" в 7,43 раза.

    И там, и тут единицы измерения — пиксели. Просто у смартфонов больше пикселей на дюйм.
    Почему так?
    • Мы смотрим на экран с меньшего расстояния.
    • Смартфонные API молоды и потому изначально рассчитывались на переменный DPI. Имеющиеся программы не пострадают.
    • И в то же время из-за маленьких экранов и больших пальцев плотная компоновка элементов управления не требуется.
    • Видимо, HiDPI-экран настольных размеров без битых пикселей будет стоить запредельно дорого.

    Иногда размеры меряют в «диалоговых единицах» и «аппаратно-независимых пикселях» (например, 1px в вебе именно что «аппаратно-независимый пиксель», который может быть 2 или 3 реальных пикселя). Но это уже офтоп.
    Ответ написан
    1 комментарий
  • Почему единицы измерения разрешений экранов мониторов и смартфонов разные?

    Единицы измерений совершенно одинаковые - пиксели.
    Просто на ноутбуках пиксели больше.
    На экранах наружной рекламы пиксели вообще с кулак.

    Ну а для игры вам должно быть всё равно на пиксели. Важно соотношение длин сторон (aspect ratio) для прорисовки интерфейса. А модельки рендерить можно на любой вьюпорт.
    Ответ написан
    2 комментария
  • Может ли tbody сам появляться?

    delphinpro
    @delphinpro Куратор тега HTML
    frontend developer
    не "может", а "обязательно появится".
    Ответ написан
    1 комментарий
  • Возможно ли изучить PHP-фреймворк параллельно разрабатывая на нём проект?

    Wolfnsex
    @Wolfnsex
    Если не хочешь быть первым - не вставай в очередь!
    Возможно ли изучить PHP-фреймворк параллельно разрабатывая на нём проект?
    Честно говоря, не представляю, как ещё по другому можно изучать фреймворк, в т.ч. PHP.

    плюс ко всему проект должен быть приспособлен к highload.
    Тогда с выбором фреймворка, нужно быть поосторожнее. "Не все фломастеры одинаково вкусные".

    микросервисы, которые обходились без больших фреймворков даже при основательных нагрузках
    Чистый PHP-код, работает быстрее чем любой фреймворк. Я имею в виду, грамотно написанный PHP-код, т.к. в нем отсутствует "лишняя" логика.

    Хочу использовать для разработки фреймворк Yii2. В чём вопрос: смогу ли я параллельно его изучая приступить к разработке
    Скорее всего да, хотя это очень индивидуально.

    и так, чтобы потом 10 раз не пришлось переделывать?
    Скорее всего нет, хотя это тоже очень индивидуально.

    Может, изучить какой-нибудь микрофреймворк?
    Возможно. Зависит от Ваших задач и целей.

    Понятное дело, что без правильно настроенного содержимого моей черепной коробки даже с 10-ти летним опытом в Yii не получится, но всё же, поделитесь опытом и дайте совет :)
    Ну я обычно с новичками, изучение с CodeIgniter'а начинаю, т.к. он не изобилует всеми новыми фишками и плюшками, и в виду отсутствия таких, казалось бы, ставшими уже стандартом вещей, как например "авторизация" - заставляет их включать голову, а не истерично рыться в поисковике на тему "как включить готовую авторизацию", но мне не редко приходиться работать с людьми, которые не очень хорошо разбираются в PHP, Фреймворках и программировании в целом или веб-разработке в целом. Не многие сходу знают, что такое MVC и так далее, а пытаться объяснить человеку, что такое класс и тут же нагружать его "пространствами имён" или "внедрением зависимостей" (и всем остальным) - не очень продуктивно (как показывает практика). Когда у обучаемого 10 лет опыта за спиной, можно сразу с Laravel/Symfony начинать, как минимум, что такое MVC и всё остальное - объяснять редко приходится, скорее, приходится показывать, "как это сделать тут", а "как надо делать вообще" - обучаемый уже и без меня отлично знает.

    P.S. Если Вы напишите больше конкретики, что знаете, что не знаете, что в Вашем понимании HiLoad, какие ресурсы у Вас для этого есть, какие примерно БД и какая примерно задача, какие фреймворки использовали раньше и использовали ли какие-то вообще, на каких языках, какие проекты (теоретически) разрабатывали ранее и т.д. будет гораздо проще дать Вам какую-то более конкретную рекомендацию.
    Ответ написан
    2 комментария