Ответы пользователя по тегу Java
  • Как обновить скачанный файл SharedPreference в Android?

    akaish
    @akaish
    Стек Java\Android
    Ни разу не приходила в голову мысль заменять xml sp. Вроде как для этого API sp и не писались. Плюсом, с высокой долей вероятности, при закрытии объекта SP в файл записываются данные из буффера SharedPreferences.Editor и не факт, что в то же время.
    Зачем вам вообще пытаться использовать этот хак? Храните данные в виде JSON и после скачивания дессериализуйте в POJO c помощью, к примеру, GSON. Ну или используйте Firebase Realtime DB. Или еще пачка стандартных решений. Просто нет гарантии, что даже если Вы сделаете так, что все заработает, работать это будет на всех версиях и устройствах.
    А, и да, хороший тон в SP использовать apply(), commit() сразу пишет изменения в файл.
    Ответ написан
  • Почему приложение вылетает только на Android P (API 28)?

    akaish
    @akaish
    Стек Java\Android
    Мало информации. Ошибка говорит о том, что нет таблички. Вы смотрели, файл бд нормально откопировался? То, что база данных открывается хелпером - ни о чем не говорит, метод openDatabase создает пустую бд, если бд по пути нет и если это возможно. Также, у вас пути сахардкожены до бд, может на Android P изменили путь для баз данных по умолчанию?
    Ответ написан
  • Как правильно организовать загрузку файлов из какого-то источника в Android?

    akaish
    @akaish
    Стек Java\Android
    Интересный вопрос. Интересен он не уникальной задачей или же сложной задачей, а тем, что вариантов реализации поставленной задачи огромное количество.

    Давайте накидаю Вам сходу некоторое количество равноправных решений.

    1) Скачивание нужных файлов по любому протоколу (HTTP\FTP\SFTP), который Вам больше подходит. Если также необходим хостинг - выбираете любого хостера по вашему вкусу. Буквально. Можно даже обойтись сверх дешевыми статичными хостингами. Из минусов - самостоятельная настройка сервера, хуже аптайм, чем в следующем варианте.

    2) Используете уже готовые связки API + хостер. Firebase, dropbox etc. Опять же, что угодно. К примеру, Dropbox: https://www.dropbox.com/developers-v1/core/start/a... Из минусов - почти идеальное решение, но нет кое-каких очень приятных возможностей. Также, стоит денег.

    3) Используете систему контроля версий. К примеру, GIT. Из плюсов - меньше трафика при обновлении вашего сета данных, 100% распределенная система, до какой-то степени "бесплатность" (при условии Open-Source лицензии на сет данных и того, что объем трафика не будет превышать бесплатные лимиты). Из минусов - сложнее реализовывать на стороне клиента.

    4) Используйте p2p. Самая сложная в реализации опция, нет функционала контроля версий. Зато самые низкие затраты на оплату траффика.

    Опции накидал сумбурно, так как Ваш вопрос не несет в себе должного уровня конкретики. Вариантов решения поставленной задачи просто огромное количество, все обладают своими плюсами и минусами. Чтобы предложить оптимальное решение, необходимо знать планируемый объем трафика, требования к аптайму, требования к функционалу решения (к примеру, нужны ли Вам функции контроля версий, и насколько высока эта нужда), бюджет, уровень Ваших навыков. Попробуйте сформулировать вопрос конкретнее и тогда вместо воды может получите совет, применимый именно для Вашего проекта.

    UPD. Лично я бы сделал либо на GIT, либо на Dropbox. API готовы, хостинги хорошие. Dropbox - один из самых простых вариантов, GIT - требует знания NDK (чуть сложнее в имплементации), зато дает просто идеальный функционал для редактирования и обновления сета данных.
    Ответ написан
  • Кнопки не реагируют на вызов. В чем может быть ошибка?

    akaish
    @akaish
    Стек Java\Android
    Код дайте по нормальному. В андроиде помимо RecyclerView и RecyclerViewAdapter есть еще и ListView, который также в паре с адаптером используется.

    Дальше, может я чего-то не понимаю (до сих пор по привычке и в целях совместимости на ListView списки делаю, RecyclerView не трогал по нормальному, так как задач с большими списками не было), но каким макаром вешается onItemClickListener() на адаптер? Или у вас собственная реализация адаптера, через метод которого Вы назначаете на целевой RecyclerView анонимную реализацию класса ListItemClickListener, унаследованную от RecyclerTouchListener????

    Я не поленился, и нагуглил ListItemClickListener в блоге какого-то глубокоуважаемого индуса: ListItemClickListener
    Вы оттуда копипастили? А откуда Вы скопипастили тогда "гениальное" решение назначать обработку событий не на View, а на адаптер? Это же в корне противоречит MVC архитектуре dataset-adapter-view. И ладно, что в блоге с примером ListItemClickListener используется просто дурацкая схема именования класса, которая сбивает с толку. Тут то архитектурная ошибка на уровне шаблонов проектирования.

    Резюмируя, предоставленного кода недостаточно, на лицо ошибки проектирования и совершенно дурацкое наименование классов потомков. Также, я не понимаю, зачем наследоваться от регулярного потомка абстрактного RecyclerView.OnItemTouchListener в анонимном то классе. Что это вообще за дичь?

    Искать ошибки не имеет смысла. Недостаточно предоставленного кода и дичь какая-то с конкретной реализацией адаптера и RecyclerView.OnItemTouchListener. Вот туториал, я его прочитал, по нему можно сделать правильно: https://www.androidhive.info/2016/01/android-worki...

    По текущему коду, связанному с RecyclerView - можно оставить только лэйауты. И всё. Остальное переписать. В этом коде я вижу малоосмысленного Франкенштейна из копипасты. Надеюсь, Вы только учитесь. Если это коммерческий проект какой-то фирмы, дайте, пожалуйста, в личку, её название. Буду обходить её продукты стороной, просто если это планируется в качестве реального кода, с таким "х@@к, х@@к и в продакшен" продуктом иметь дел не хочется, как, впрочем, и работать с такими людьми.

    UPD.1 Еще раз пробежался по коду глазами. Что это за дичь?
    private void loadData() {
            showLoader();
            loadJson();
    }

    И
    hideLoader();
    adapter.notifyDataSetChanged();

    метода parseJson(String jsonData)??? Как бы продолжительные операции делаются вне GUI потока, иначе можно ANR получить. Реализуется через AssyncTask (простой способ).

    UPD.2
    @Override
        public void onBackPressed() {
            if (drawer != null && drawer.isDrawerOpen()) {
                drawer.closeDrawer();
            } else {
                AppUtilities.tapPromtToExit(this);
            }
        }

    Вот не надо тащить из дикого веба диалоги "А Вы точно хотите выйти?". На андроиде подтверждение выхода из приложения принято делать двойным тапом на back кнопку с Toast после первого тапа. Диалог следует вешать только в тех случаях, когда при случайном выходите возможна потеря пользовательских данных (к примеру, набора текста). И то, если правильно подходить к разработке Android приложений, таких ситуаций возникать не должно в принципе. В догонку: Understand the Activity Lifecycle

    UPD.3 Ну и хоть бы код форматировали. В Android Studio хоткей по умолчанию CTRL-SHIFT-ALT-L.
    Ответ написан