Android Mobile | YeaHub
430 subscribers
332 photos
21 videos
597 links
Теория, подготовка к интервью и курсы для Android разработчиков

YeaHub — это платформа для IT-специалистов, объединяющая обучение, карьерный рост, развитие и сообщество единомышленников.

Платформа: https://yeahub.ru

Для связи: @ruslan_kuyanets
Download Telegram
Channel created
🤝 Добро пожаловать в экосистему YeaHub!

YeaHub — это платформа для IT-специалистов, объединяющая обучение, карьерный рост, развитие и сообщество единомышленников. Подпишитесь на наши каналы, чтобы не пропустить:

👩‍💻 C# 🤖 ML Engineer

👩‍💻 C/C++ 🖥 Data Science

👩‍💻 Java 👩‍💻 Python

🖥 PHP 👩‍💻 Frontend

👣 Rust 👣 Golang

🖥 Ruby 👩‍💻 Node.js

👩‍💻 QA 👩‍💻 Android

👩‍💻 iOS 👩‍💻 Game Dev

💻 DevOps 🖥 Общее IT

📆 Митапы 👨‍💻 Вакансии

Здесь вы найдете всё, что нужно для вашего направления — в одном месте, без необходимости подписываться на десятки каналов.

💬 YeaHub Community: Общение, обмен опытом и поддержка единомышленников

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

Миссия YeaHub — создать сообщество активных IT-специалистов, которые вместе развиваются, задают стандарты в индустрии, общаются и помогают друг другу. Мы стремимся к созданию саморегулирующегося сообщества, где каждый участник вносит вклад в развитие отрасли и поддерживает высокие профессиональные стандарты.


👍 Обучайтесь, общайтесь, растите вместе с https://yeahub.ru
Please open Telegram to view this post
VIEW IN TELEGRAM
Android Mobile | YeaHub pinned «🤝 Добро пожаловать в экосистему YeaHub! YeaHub — это платформа для IT-специалистов, объединяющая обучение, карьерный рост, развитие и сообщество единомышленников. Подпишитесь на наши каналы, чтобы не пропустить: 👩‍💻 C# 🤖 ML Engineer 👩‍💻…»
👨🏻‍💻 Мобильный разработчик (Kotlin) Junior+/ Middle

Локация: Удалённо в РФ
Компания: CODEX
ЗП: от 80 000 до 150 000 р.
Занятость: Полная/Частичная
Требуемый опыт работы: от 1,5 лет

Требования
▪️ Опыт коммерческой разработки на Kotlin 1,5+ года;
▪️ Уверенные знания работы с REST API и СУБД.

Условия
▪️ Конкурентная заработная плата и возможность карьерного роста;
▪️ Гибкий график работы и комфортные условия труда;
▪️ Возможность участия в интересных и амбициозных проектах, а также обучение новым технологиям;
▪️ Возможности для профессионального и личного роста;
▪️ Работа в команде профессионалов;
▪️ Дружелюбная атмосфера и поддержка коллег.

💬 Резюме отправлять: @nikita_recr
Please open Telegram to view this post
VIEW IN TELEGRAM
#ЧеКак
🤔 До какого момента ViewModel гарантирует сохранение состояния?

ViewModel в Android гарантирует сохранение состояния до тех пор, пока соответствующее Activity или Fragment находится в памяти.

🟠Поворот экрана
При изменении конфигурации, например, повороте экрана, Activity уничтожается и пересоздается. ViewModel выживает эти изменения конфигурации, обеспечивая сохранение состояния.

🟠Навигация между фрагментами
Когда вы переходите между фрагментами в одном Activity, ViewModel фрагмента сохраняет свои данные.

🚩Когда ViewModel уничтожается

🟠Завершение процесса
Если операционная система решает завершить процесс приложения для освобождения ресурсов, ViewModel будет уничтожен.

🟠Удаление Activity из памяти
Когда пользователь закрывает Activity или приложение завершает работу (например, при нажатии кнопки "назад" до закрытия Activity), ViewModel будет уничтожен вместе с Activity.

Пример использования ViewModel
// ViewModel
public class MyViewModel extends ViewModel {
private MutableLiveData<String> data;

public MyViewModel() {
data = new MutableLiveData<>();
}

public LiveData<String> getData() {
return data;
}

public void setData(String newData) {
data.setValue(newData);
}
}

// Activity
public class MyActivity extends AppCompatActivity {
private MyViewModel viewModel;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

viewModel = new ViewModelProvider(this).get(MyViewModel.class);

// Подписка на изменения данных
viewModel.getData().observe(this, newData -> {
// Обновление UI
});

// Установка новых данных
viewModel.setData("Hello, World!");
}
}


👉Новости 👉Платформа
Please open Telegram to view this post
VIEW IN TELEGRAM
🤓 Какой метод
используется для
выполнения НТТР- запросов в Kotlin с помощью библиотеки Ktor?
Anonymous Quiz
0%
httpClient.get()
0%
httpRequest.send()
75%
httpClient.request()
25%
httpRequest.execute()
#ЧеКак
🤔 Какой минус есть у виртуальных таблиц?

Виртуальные таблицы, такие как те, что используются в SQLite с помощью CREATE VIRTUAL TABLE, предлагают мощные возможности для работы с данными. Однако они также имеют некоторые недостатки.

🟠Ограниченная поддержка стандартных функций SQL
Виртуальные таблицы могут не поддерживать все стандартные функции и возможности SQL, такие как ограничения (constraints), триггеры и определенные типы индексов. Это связано с тем, что их функциональность определяется модулем, который реализует виртуальную таблицу.
CREATE VIRTUAL TABLE my_virtual_table USING fts4(content TEXT);


🟠Производительность
Виртуальные таблицы могут иметь производительность ниже, чем обычные таблицы, особенно если они не оптимизированы должным образом. Производительность может пострадать из-за дополнительных накладных расходов, связанных с обработкой виртуальных таблиц на уровне приложения или расширений.

🟠Сложность реализации и обслуживания
Использование виртуальных таблиц требует дополнительных знаний и опыта в разработке и обслуживании. Например, вам может потребоваться написать и поддерживать специализированные модули или расширения для реализации виртуальных таблиц, что увеличивает сложность кода и потенциальные затраты на поддержку.

👉Новости 👉Платформа
Please open Telegram to view this post
VIEW IN TELEGRAM
#ЧеКак
🤔 Что такое мульти-декларации (destructuring declarations)?

Это способ извлечения значений из объекта и присвоения их сразу нескольким переменным. В Kotlin этот механизм поддерживается с помощью оператора распаковки (destructuring operator) — componentN(), где N — номер компонента.

При создании data класса Kotlin автоматически создает функции componentN() для каждого свойства класса, где N — номер позиции переменной в конструкторе. Функции componentN() возвращают значения свойств в порядке их объявления в конструкторе. Это позволяет использовать мульти-декларации для распаковки значений свойств и присваивания их отдельным переменным.

🚩Пример

Если у нас есть data класс Person с двумя свойствами name и age, мы можем использовать мульти-декларации, чтобы извлечь эти свойства и присвоить их двум переменным:

data class Person(val name: String, val age: Int)

val person = Person("Alice", 29)
val (name, age) = person

println(name) // Alice
println(age) // 29

Также можно использовать мульти-декларации в циклах, чтобы итерироваться по спискам объектов и распаковывать значения свойств:


val people = listOf(Person("Alice", 30), Person("Bob", 40))
for ((name, age) in people) {
println("$name is $age years old")
}

// Alice is 30 years old
// Bob is 40 years old


Мульти-декларации также могут быть использованы с массивами и другими коллекциями:

val list = listOf("apple", "banana", "orange")
val (first, second, third) = list

println(first) // apple
println(second) // banana
println(third) // orange


👉Новости 👉Платформа
Please open Telegram to view this post
VIEW IN TELEGRAM
#Вакансии
👨‍💻 Android Developer

Локация: Удалённо в РФ
Компания: Effective
ЗП: до 300 000 р. на руки
Занятость: Полная
Требуемый опыт работы: 3+ лет

Effective – IT компания, специализирующаяся на заказной mobile и web-разработке высококачественных цифровых сервисов и продуктов для Retail, Telecom и B2G бизнесов.

🚩Мы ожидаем от тебя
▪️Глубокое понимание Kotlin и Android;
▪️Опыт разработки UI компонентов с Compose и/или View;
▪️Опыт работы в многомодульных проектах. Умение применять RxJava 2 и Flow;
▪️Применение принципов Dependency Injection (Dagger 2);
▪️Опыт работы с Coroutines.

🚩Будет плюсом
▪️Написание unit-тестов и опыт написания автотестов для Android (Espresso/Kaspresso);
▪️Опыт написания автотестов с подменой ответов бэкенда (моки);
▪️Работа с инструментами для тестирования серверного API (Postman, SoapUI).

🚩Предстоящие задачи
▪️Работа в команде над разработкой Android приложения;
▪️Подключение к покрытию мобильных приложений автотестами;
▪️Автоматизация и поддержка сценариев тестирования в Android приложении;
▪️Необходимо писать авто тесты, оптимизировать и ускорять сами автотесты, дорабатывать CI-пайплайны;
▪️Писать и дорабатывать PageObject-ы для экранов;
▪️Дорабатывать тестовую систему для поддержки новых элементов и взаимодействия с ними;
▪️Дорабатывать тестовую инфраструктуру.

🚩От нас
▪️Работа в аккредитованной IT компании;
▪️Лояльные руководители и отсутствие бюрократии;
▪️Performance review: регулярный фидбек от тимлидов, понимание зон роста, помощь в развитии в интересном направлении;
▪️Work-life balance: поддержка и компенсация обучения и здорового образа жизни;
▪️Ежегодные путешествия с командой: расширяем географию и завоевываем новые вершины, разделяем прекрасные моменты вместе;
▪️Совместные времяпровождения: Happy Friday & Monthly Stand-up, участие во внутренних мероприятиях и инициативах. Разделим интерес каждого и найдем хобби по душе;
▪️Smart-мероприятия для сотрудников как внутри компании и города, так и за пределами: мы организовываем Student Labs, DevFest для Senior-разработчиков

💬 Резюме отправлять: @Vitaly_Researcher

👉Новости 👉Платформа
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Как в Kotlin обозначается безопасное приведение типа, которое не вызовет исключение при неудаче?
Anonymous Quiz
11%
as
0%
is
89%
as?
0%
safeCast
#ЧеКак
🤔 В чём различия наследования, композиции, агрегации?

Наследование предполагает создание нового класса на основе существующего. Композиция включает один класс в качестве части другого для использования его функциональности. Агрегация — слабая форма композиции, где включённый объект может существовать независимо от владельца.

👉Новости 👉Платформа
Please open Telegram to view this post
VIEW IN TELEGRAM
#ЧеКак
🤔 Как бы реализовал приложение, которое может загружать большие файлы на сервер?

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

1⃣Настройка зависимостей
В файле build.gradle вашего модуля добавьте следующие зависимости:
dependencies {
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
implementation 'androidx.work:work-runtime-ktx:2.7.1'
}


2⃣Настройка Retrofit
Создайте интерфейс для API и настройте Retrofit.
// UploadAPI.java
public interface UploadAPI {
@Multipart
@POST("/upload")
Call<ResponseBody> uploadFile(@Part MultipartBody.Part file);
}

// RetrofitClient.java
public class RetrofitClient {
private static Retrofit retrofit = null;

public static Retrofit getClient(String baseUrl) {
if (retrofit == null) {
retrofit = new Retrofit.Builder()
.baseUrl(baseUrl)
.addConverterFactory(GsonConverterFactory.create())
.build();
}
return retrofit;
}
}


3⃣Создание Worker для загрузки файла
Используйте WorkManager для загрузки файла в фоновом режиме.
// FileUploadWorker.java
public class FileUploadWorker extends Worker {

public FileUploadWorker(@NonNull Context context, @NonNull WorkerParameters params) {
super(context, params);
}

@NonNull
@Override
public Result doWork() {
String filePath = getInputData().getString("file_path");
if (filePath == null) {
return Result.failure();
}

File file = new File(filePath);
RequestBody requestFile = RequestBody.create(MediaType.parse("multipart/form-data"), file);
MultipartBody.Part body = MultipartBody.Part.createFormData("file", file.getName(), requestFile);

UploadAPI api = RetrofitClient.getClient("https://yourserver.com/").create(UploadAPI.class);
Call<ResponseBody> call = api.uploadFile(body);

try {
Response<ResponseBody> response = call.execute();
if (response.isSuccessful()) {
return Result.success();
} else {
return Result.retry();
}
} catch (IOException e) {
e.printStackTrace();
return Result.retry();
}
}
}


👉Новости 👉Платформа
Please open Telegram to view this post
VIEW IN TELEGRAM
#Вакансии
👨‍💻 Android разработчик

Локация: Удалённо
Компания: ООО ИнстаДев
ЗП: от 120 000 до 200 000 р.
Занятость: Полная

🚩Рассматриваем кандидатов с:
▪️Опытом коммерческой разработки на Java/Kotlin;
▪️Опытом применения паттернов: MVP, MVVM, CLEAN;
▪️Опытом работы с внешними библиотеками Dagger2, RxJava2;
▪️Опытом работы с coroutine + flow;
▪️Знанием основных фреймворков, опыт работы с WS/REST/RPC;
▪️Умение писать поддерживаемый, изолированный и тестируемый код;
▪️Желательно знание dagger hilt и jetpack navigation.

🚩Будет плюсом:
➕Знание основных структур данных и паттернов, умение с ними работать;
➕Понимание принципов многопоточного программирования;
➕Опыт создания кастомных UI компонентов;
➕Наличие опыта работы с jetpack(ViewModel, lifecycle, room, paging...).

🚩Мы готовы предложить:
▪️Работу в самом удобном месте - дома или на море под пальмами;
▪️Минимум бюрократии и живое и личное отношение;
▪️Гибкий рабочий график;
▪️Возможность делиться экспертностью с нашими сотрудниками, а также с теми, кто только начинает свой путь в IT;
▪️Оплату обучения;
▪️Большие возможности для развития;
З/п зависит от вашего грейда и обсуждается на собеседовании.

📩 Резюме отправлять: a.borodulina@instadev.net

👉Новости 👉Платформа
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Что такое руты в сборщике мусора?

Руты (GC Roots) — это объекты, которые сборщик мусора считает "живыми" и от которых начинается поиск достижимых объектов. Примеры GC Roots:
🟠Локальные переменные в стеке потока.
🟠Статические поля классов.
🟠Объекты, на которые ссылаются JNI (Native) ссылки.
Если объект не достижим из GC Roots, он помечается для удаления.

👉Новости 👉Платформа
Please open Telegram to view this post
VIEW IN TELEGRAM
#ЧеКак
🤔 Что такое мульти-декларации (destructuring declarations)?

Мульти-декларации — это способ извлечения значений из объекта и присвоения их сразу нескольким переменным. В Kotlin этот механизм поддерживается с помощью оператора распаковки (destructuring operator) — componentN(), где N — номер компонента.

🟠При создании data класса Kotlin автоматически создает функции componentN() для каждого свойства класса, где N — номер позиции переменной в конструкторе. Функции componentN() возвращают значения свойств в порядке их объявления в конструкторе. Это позволяет использовать мульти-декларации для распаковки значений свойств и присваивания их отдельным переменным.

🚩Пример
если у нас есть data класс Person с двумя свойствами name и age, мы можем использовать мульти-декларации, чтобы извлечь эти свойства и присвоить их двум переменным:

data class Person(val name: String, val age: Int)

val person = Person("Alice", 29)
val (name, age) = person

println(name) // Alice
println(age) // 29

Также можно использовать мульти-декларации в циклах, чтобы итерироваться по спискам объектов и распаковывать значения свойств:


val people = listOf(Person("Alice", 30), Person("Bob", 40))
for ((name, age) in people) {
println("$name is $age years old")
}

// Alice is 30 years old
// Bob is 40 years old


Мульти-декларации также могут быть использованы с массивами и другими коллекциями:

val list = listOf("apple", "banana", "orange")
val (first, second, third) = list

println(first) // apple
println(second) // banana
println(third) // orange


👉Новости 👉Платформа
Please open Telegram to view this post
VIEW IN TELEGRAM
#ЧеКак
🤔 Разница между merge и rebase

Merge и Rebase — это команды в Git для объединения веток, но работают они по-разному. Merge создает новый коммит слияния, сохраняя историю обеих веток, что может привести к разветвленной истории. Rebase переписывает историю, перенося коммиты текущей ветки на вершину другой, делая историю линейной и более чистой, но с потенциальными рисками для уже опубликованного кода.

👉Новости 👉Платформа
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 В Kotlin, как можно инициализировать переменную типа List<Int> с числами от 1 до 10?
Anonymous Quiz
20%
val numbers = List(10) { it + 1 }
50%
val numbers = listOf(1..10)
20%
val numbers = (1..10).toArray()
10%
val numbers = mutableListOf(1 until 11)
#ЧеКак
🤔 Можно ли создать data class без свойства (пустой)?

Нет, data class требует хотя бы одного свойства в первичном конструкторе. Это необходимо для автоматической генерации методов equals, hashCode и toString.

👉Новости 👉Платформа
Please open Telegram to view this post
VIEW IN TELEGRAM