Pull to refresh
48
0
Andreev Dmitry @app-z

User

Send message

Android Ktorfit+Compose

Level of difficultyMedium
Reading time9 min
Views2.3K

Используется Ktorfit для получения данных из сети. Room для кэширования результатов запроса. Compose для отображение данных

Без использования Room, проект уровня тестового задания на Мидла-Синьера, рассчитанного на 20 часов. На Синьера могут попросить реализовать логин или biometric authentication как бонус

Данные для списка берутся из https://api.spacexdata.com/v4/launches. Размер примерно 450kb

Читать далее
Total votes 3: ↑1 and ↓2-1
Comments11

NoArchitecture Kotlin Compose

Level of difficultyEasy
Reading time5 min
Views1.9K

Статья про основные моменты использования Compose в Android разработке на примере простого приложения. Три таба в одном Activity. Обращение в сеть, парсинг Json. Немного анимации. Приложение сделано на коленке за пару дней. Скорее как вопрос к сообществу

TODO: Добавить Clean Architecture

Не кидайтесь тапками, лучше пишите советы как ускорить загрузку списка на холодную и как запустить xcode-kotlin plugin в Xcode

Читать далее
Total votes 6: ↑5 and ↓1+4
Comments4

Doom Boy ESP32. Вторая итерация

Reading time7 min
Views14K
Так и не дождавшись DoomWatch платы сделал новый заказ с доставкой Fedex. В этот раз развел платы в KiCad. Как ни странна, Kicad понравился даже больше Eagle AutoDesk



Основная цель была попробовать распаять чип esp32d0wdq6. Не сам готовый модуль, а именно отдельно микросхемой с отдельным Flash и PSRAM. Как это сделано и работает, с видеодемками, читаете и смотрите дальше
Total votes 43: ↑43 and ↓0+43
Comments21

Интеграция в проект LVGL графической библиотеки для микроконтроллеров

Reading time4 min
Views31K
LVGL — Light and Versatile Graphics Library также известная как LittleVGL.


Библиотека поддерживает большое количество микроконтроллеров, таких как STM32, ESP32 и другие. Мне пока удалось запустить полноценную демо программу на ESP32 и STM32f429 Discovery. Библиотека открытая, поддерживает большое количество графических элементов с Dark and Light темами. Распространяется под MIT license. Можно свободно использовать даже в коммерческих продуктах. Можно посмотреть интерактивное Online Demo без установки на устройство
Total votes 39: ↑39 and ↓0+39
Comments56

Android LiveData на Kotlin с использованием Retrofit и coroutines

Reading time6 min
Views21K
Статья рассказывает об использовании Android Components ViewModel, LifeCycle и LiveData. Эти компоненты позволяют не заботиться о жизненном цикле Activity.

Так же рассмотрен пример применения современного Coroutines в связке с репозитарием на Retrofit

fun main(args: Array<String>): Unit = runBlocking {
    // Wait (suspend) for Result
    val result: Result<User> = api.getUser("username").awaitResult()
    // Check result type
    when (result) {
        //Successful HTTP result
        is Result.Ok -> saveToDb(result.value)
        // Any HTTP error
        is Result.Error -> log("HTTP error with code ${result.error.code()}", result.error)
        // Exception while request invocation
        is Result.Exception -> log("Something broken", e)
    }
}
Читать дальше →
Total votes 16: ↑15 and ↓1+14
Comments3

Встраиваем RecyclerView в CardView

Reading time14 min
Views18K


Прочитав пост на хабре о новых виджетах «RecyclerView и CardView. Новые виджеты в Android L», решил попробовать использовать. В сети много примеров, где CardView встраивается в RecyclerView. Интересовало наоборот встроить RecyclerView в CardView. Чтобы еще эта конструкция была фрагментом.
Читать дальше →
Total votes 18: ↑15 and ↓3+12
Comments4

Android Volley Loader. Движение в сторону библиотеки

Reading time9 min
Views6.6K
Дальнейшие эксперименты по скрещиванию Volley и Loader привели меня к мысли о создании библиотеки. Чтобы вызывался Loader с параметрами и в одну строку. На подобии как это реализовано в Picaso. После пары вечеров что-то получилось…

JSON
{
"1":{"name":"Samsung","price":51200.6},
"2":{"name":"Lg","price":5400.6},
"3":{"name":"Alcatel","price":4500.6},
"4":{"name":"iPhone","price":4800.3},
"7":{"name":"iPad","price":2850.1}
}

Data
public class GoodsItem {
    String name;
    float price;
}

Loader
    private String url = "http://192.168.1.103/shop.json";
    private static final int LOADER_GOODS_ID = 1;
    Map<Integer, GoodsItem> mGoodsMap;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ...
        FeedLoader.with(this).addLoader(LOADER_GOODS_ID, url, HashMap.class, new DelivererFeedLoader.Listener<Map<Integer, GoodsItem>>() {
            @Override
            public void onResponse(int loaderId, 
                Map<Integer, GoodsItem> goodsMap) {
                mGoodsMap = goodsMap;
                for (Map.Entry<Integer, GoodsItem> entry : mGoodsMap.entrySet()) {
                    Log.d(TAG , "Goods item : " + entry.getKey() + " : " + entry.getValue());
                }
            }
            @Override
            public void onErrorResponse(VolleyError data) {
                Log.d(TAG , "onErrorResponse :" + data);
            }
        }).start(LOADER_GOODS_ID, this);

Читать дальше →
Total votes 12: ↑10 and ↓2+8
Comments9

Android Volley custom Loader

Reading time8 min
Views12K
В статье изложен подход реализации Loader для загрузки разных объектов в одном Activity. В качестве сетевой библиотеки загрузки используется Volley. Метод подходит когда в одном Activity имеется несколько одновременно использующихся фрагментов

public class MainActivity extends ActionBarActivity
        implements LoaderManager.LoaderCallbacks<DataHolder>{
    ...
    @Override
    public void onLoadFinished(Loader<DataHolder> loader, DataHolder data) {
        if ( loader.getId() == DataLoader.LOADER_ICONS_ID ){
           doIcons( data.getIcons() );
        } else if( loader.getId() == DataLoader.LOADER_STYLES_ID ){
           doStyles( data.getStyles() );
        } else if( loader.getId() == DataLoader.LOADER_ICONSETS_ID ){
           doIconSets( data.getIconSets() );
        }


Читать дальше →
Total votes 10: ↑9 and ↓1+8
Comments10

Gson шпаргалка для Map, List и Array

Reading time3 min
Views60K
Постоянно сталкиваясь с парсингом Json всегда подглядываю в старых проектах или на встретившуюся реализацию объекта на stackoverflow.com.

Решил собрать три основных типа в шпаргалку Map, List, Array.

Type itemsMapType = new TypeToken<Map<Integer, GoodsItem>>() {}.getType();
Type itemsListType = new TypeToken<List<GoodsItem>>() {}.getType();
Type itemsArrType = new TypeToken<GoodsItem[]>() {}.getType();


Рассматривается Serialization/Deserialization операции класса:

public class GoodsItem{
    String name;
    float price;
    public GoodsItem(String name, float price) {
    this.name = name;
    this.price = price;

    public String toString(){
	return name + " : " + price;
    }
}

Читать дальше →
Total votes 10: ↑6 and ↓4+2
Comments8

Кастомные функции SQLite Android или своя LOWER_FNC()

Reading time5 min
Views8.9K
SELECT * WHERE LOWER_FNC(name) like '%" + filterText + "%'"

При разработке Android приложения столкнулся с проблемой в запросе SQLite фильтра с русскими буквами. Для английской локализации проблем нет. Для других интернациональных раскладок некорректно обрабатывались заглавные буквы в запросе.
Немного разобравшись я наткнулся на следующее описание:

(18) Case-insensitive matching of Unicode characters does not work.

The default configuration of SQLite only supports case-insensitive comparisons of ASCII characters. The reason for this is that doing full Unicode case-insensitive comparisons and case conversions requires tables and logic that would nearly double the size of the SQLite library. The SQLite developers reason that any application that needs full Unicode case support probably already has the necessary tables and functions and so SQLite should not take up space to duplicate this ability.

Instead of providing full Unicode case support by default, SQLite provides the ability to link against external Unicode comparison and conversion routines.

Вероятно текущая реализация SQLite Android и есть
only supports case-insensitive comparisons of ASCII characters


Видел решение через CursorWrapper но решил все таки собрать свою версию SQLite и использовать addCustomFunction

Что из этого получилось читайте под катом
Читать дальше →
Total votes 14: ↑13 and ↓1+12
Comments1

Information

Rating
Does not participate
Registered
Activity

Specialization

Mobile Application Developer
Senior
Git
English
Linux