모던 안드로이드 (오준석의 생존코딩)
- DB를 이용한 데이터 저장 방법 Room
- LiveData
- Room 비동기 처리
- UI와 로직 분리 ViewModel
- DataBinding
모던 안드로이드 #1 – DB를 이용한 데이터 저장 방법 Room
모던 안드로이드 #3 LiveData
모던 안드로이드 #5 – Room 비동기 처리
모던 안드로이드 #7 – UI와 로직 분리 ViewModel
https://developer.android.com/training/data-storage/room
https://developer.android.com/topic/libraries/architecture/adding-components
https://developer.android.com/jetpack/androidx/releases/lifecycle
Room 라이브러리 추가
MainActivity 에서 onCreate() 에서 Room 입력하고 Alt + Enter -> Add Dependency
activity_main.xml
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<EditText
android:id="@+id/todo_edit"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginEnd="8dp"
android:hint="할 일"
android:inputType="textPersonName"
app:layout_constraintEnd_toStartOf="@+id/add_button"
app:layout_constraintStart_toStartOf="parent" />
<Button
android:id="@+id/add_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
android:text="Button"
app:layout_constraintEnd_toEndOf="parent" />
<TextView
android:id="@+id/result_text"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
android:layout_marginBottom="8dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/add_button" />
</androidx.constraintlayout.widget.ConstraintLayout>
import androidx.room.Database;
import androidx.room.RoomDatabase;
@Database(entities = {Todo.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
public abstract TodoDao todoDao();
}
import androidx.room.Entity;
import androidx.room.PrimaryKey;
@Entity
public class Todo {
@PrimaryKey(autoGenerate = true)
private int id;
private String title;
public Todo(String title) {
this.title = title;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
@Override
public String toString() {
return "Todo{" +
"id='" + id + '\'' +
", title='" + title + '\'' +
'}';
}
}
import androidx.lifecycle.LiveData;
import androidx.room.Dao;
import androidx.room.Delete;
import androidx.room.Insert;
import androidx.room.Query;
import androidx.room.Update;
import java.util.List;
@Dao
public interface TodoDao {
@Query("SELECT * FROM ToDo")
LiveData<List<Todo>> getAll();
@Insert
void insert(Todo todo);
@Update
void Update(Todo todo);
@Delete
void Delete(Todo todo);
}
모던 안드로이드 #9 – DataBinding
https://developer.android.com/topic/libraries/data-binding/start#build_environment
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
<variable
name="viewModel"
type="com.myhome.mymodernexercisingapplication.MainViewModel" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<EditText
android:id="@+id/todo_edit"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginEnd="8dp"
android:hint="할 일"
android:text="@={viewModel.newTodo}" // 양방향 바인딩
android:inputType="textPersonName"
app:layout_constraintEnd_toStartOf="@+id/add_button"
app:layout_constraintStart_toStartOf="parent" />
<Button
android:id="@+id/add_button"
android:onClick="@{() -> viewModel.insert(viewModel.newTodo)}"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
android:text="Button"
app:layout_constraintEnd_toEndOf="parent" />
<TextView
android:id="@+id/result_text"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
android:layout_marginBottom="8dp"
android:text="@{viewModel.todos.toString()}"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/add_button" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
import android.app.Application;
import android.os.AsyncTask;
import androidx.annotation.NonNull;
import androidx.lifecycle.AndroidViewModel;
import androidx.lifecycle.LiveData;
import androidx.lifecycle.ViewModel;
import androidx.room.Room;
import java.util.List;
public class MainViewModel extends AndroidViewModel {
private AppDatabase db;
public LiveData<List<Todo>> todos;
public String newTodo;
public MainViewModel(@NonNull Application application) {
super(application);
db = Room.databaseBuilder(application, AppDatabase.class, "todo-db")
//.allowMainThreadQueries() // 편의상 메인쓰레드에서 동작하도록 설정
.build();
todos = getAll();
}
public LiveData<List<Todo>> getAll() {
return db.todoDao().getAll();
}
public void insert(String todo) {
new InsertAsyncTask(db.todoDao()).execute(new Todo(todo));
}
private static class InsertAsyncTask extends AsyncTask<Todo, Void, Void> {
private TodoDao mTodoDao;
public InsertAsyncTask(TodoDao todoDao) {
this.mTodoDao = todoDao;
}
@Override
protected Void doInBackground(Todo... todos) {
mTodoDao.insert(todos[0]);
return null;
}
}
}
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
binding.setLifecycleOwner(this);
MainViewModel viewModel = new ViewModelProvider(this).get(MainViewModel.class);
binding.setViewModel(viewModel);
}
}
모던 안드로이드 #18 [백그라운드 처리] 3. AsyncTask를 대신할 Java 비동기 처리 솔루션
모던 안드로이드 #19 [백그라운드 처리] 4. LiveData 연동하여 UI 유지하기
https://developer.android.com/guide/background/threading
https://developer.android.com/topic/libraries/architecture/adding-components
모던 안드로이드 (오준석의 생존코딩) 유튜브 강의
https://www.youtube.com/watch?v=pG6OkJ3rSjg&list=PLxTmPHxRH3VXHOBnaGQcbSGslbAjr8obc&index=1
될 때까지 안드로이드 (오준석의 생존코딩) 깃헙
https://github.com/junsuk5/android-first-book
될 때까지 안드로이드 소스 다운로드
android-first-book-master.zip