여러 이미지를 연속해서 바꿔가며 애니메이션 효과를 만들고 싶을 때 스레드를 사용하는 경우가 많다. 특히 표준 자바에서 게임 들에 사용하는 대부분의 애니메이션 효과는 스레드를 사용하므로 기존의 앱 소스를 안드로이드용으로 포팅하려고 할 때는 이미 만들어두었던 코드와 같은 방식을 사용하는 것이 가장 쉽기 때문에 많이 사용한다. 바로 예제를 한번 확인해보자. ImageView를 하나 생성하고, 버튼을 눌렀을 때 스레드가 지속적으로 Runnable객체를 사용하여 ImageView의 이미지를 바꿔주는 간단한 예제이다. ◎MainActivity.java package com.example.samplethreadanimation; import android.content.res.Resources; import andr..
직전에 확인했던 메시지 객체를 메인 스레드에서 별도의 스레드로 전송하는 코드를 확인해보면, 생각보다 복잡하다는 느낌이 든다. 핸들러를 사용하지 않고 좀 더 간단하게 동일한 기능을 수행하도록 Thread 코드를 작성할 수도 있는데, AsyncTask 객체를 사용하면 된다. AsyncTask 클래스를 상속하여 새로운 클래스를 만들면 그 안에 스레드를 위한 코드와 UI 접근 코드를 함께 넣을 수 있다. AsyncTaSK 객체를 만들고 excute() 메서드를 실행하면 이 객체는 정의된 백그라운드 작업을 수행하고 필요한 경우에 그 결과를 메이느스레들에서 실행하기 때문에 UI 객체에 접근하는 데 문제가 없다. 다음은 AsyncTask를 이용한 작업 방식을 그림으로 나타낸 것이다. AsyncTask 에 정의된 주요..
새로 생성한 스레드에서 메인 스레드로 데이터를 넘기는 건 Handler 객체의 메시지 큐와 Runnable 객체를 사용하여 실습해봤지만, 그 반대의 경우도 가능하다. 메인 스레드에서 변수를 선언하고 별도의 스레드가 그 값을 읽어가는 방법을 사용할 수 있다. 하지만 별도의 스레드가 관리하는 동일한 객체를 여러 스레드가 접근할 경우 예외가 발생할 수 있기 때문에 별도의 스레드 안에 들어있는 메시지 큐를 이용해 순서대로 접근하도록 만들어야 한다. 핸들러는 메시지 큐를 Looper를 사용하여 처리한다. Looper는 메시지 큐에 들어오는 메시지를 지속적으로 확인하면서 하나씩 처리하게 된다. 바로 한번 확인해보자. ◎MainActivity.java package com.example.samplelooper; im..
Runnable 객체를 이용하여 메인 스레드를 제어할 때, post() 메서드가 아닌 postDelayed() 를 사용하여 딜레이를 설정할 수 있다. 그렇게 어려운 내용은 아니니, 바로 예제로 넘어가자. ◎MainActivity.java package com.example.sampledelayed; import android.content.DialogInterface; import android.os.Handler; import android.os.Looper; import android.view.View; import android.widget.Button; import android.widget.TextView; import androidx.appcompat.app.AlertDialog; import..
직전 포스팅에서 스레드와 핸들러를 이용하여 새 스레드에서 메인 스레드를 제어할 수 있는 방법을 확인했는데, 핸들러 객체를 생성하고 스레드에서 이를 활용하기 위해 작성한 코드가 조금 복잡해 보인다는 단점이 있다. 핸들러 클래스는 메시지큐를 이용한 데이터 전송 방법 이외에도 Runnable 객체를 실행할 수 있는 방법을 제공한다. 바로 확인해보자. ◎MainActivity.java package com.example.samplethread; import android.os.Handler; import android.os.Looper; import android.os.Message; import android.util.Log; import android.view.View; import android.widge..
Android 에서 하나의 액티비티는 하나의 프로세스에서 처리되기 때문에 메인 액티비티 내에서 어떤 이벤트를 처리하거나 특정 메서드를 정의하여 기능을 구현할 때도 같은 프로세스 안에서 동작을 한다. 그렇기 때문에 대기 시간이 길어지는 동작을 수행할 때는 해당 액티비티가 멈춰버리는 문제가 생길 수 있다. 이런 경우 사용할 수 있는 2개의 시나리오는 다음과 같다. 구분 시나리오 서비스 사용 백그라운드 작업은 서비스로 실행하고 사용자에게는 알림 서비스로 알려준다. 만약 메인 액티비티로 결과 값을 전달하고 이를 이용해서 다른 작업을 수행하고자 한다면, 브드드캐스팅으로 결과 값을 전달해야 한다. 스레드 사용 스레드는 같은 프로세스 안에 있기 때문에 작업 수행의 결과를 바로 처리할 수 있다. 그러나 UI 객체는 직..
스피너는 HTML selector와 비슷한 기능으로 콤보 박스 안에 데이터를 하나 선택할 수 있도록 하는 위젯이다. 레이아웃 파일에 spinner 태그를 추가하여 간단하게 사용할 수 있다. ◎activity_main.xml ◎MainActivity.java package com.example.samplespinner; import android.view.View; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.Spinner; import android.widget.TextView; import androidx.appcompat.app.AppCompatActivity; import and..
일반적인 뷰 객체가 아닌 여러 개의 아이템 중에 하나를 선택할 수 있는 리스트 모양의 위젯을 안드로이드에서는 선택 위젯이라고 부르며 일반 위젯과는 구별하여 사용한다. 선택 위젯이 어댑터 패턴을 통해서 데이터를 관리하기 때문인데, 이 어댑터 패턴은 원본 데이터를 뷰에 직접 설정하지 않고 어댑터 클래스를 사용하여 선택 위젯에 보이는 각 아이템이 화면에 표시되기 전에 어댑터의 getView() 메서드를 호출하여 아이템을 반환받아 뷰에 표시하는 특징이 있다. 리사이클러 뷰는 각각의 아이템이 화면에 보일 때 메모리를 효율적으로 사용하도록 캐시를 구현하고 있기 때문에 일반적인 리스트뷰 보다 사용이 권장된다. 바로 한번 확인해보자. 우선, activity_main 레이아웃 내부에 리사이클러 뷰를 구성한다. ◎acit..
직전 포스팅에서 커스텀 버튼 객체를 만들고 이를 레이아웃에 넣어보는 예제를 했다. 버튼과 마찬가지로 레이아웃도 뷰 객체이기 때문에 레이아웃으로 구성된 위젯 객체를 직접 만들 수 있다. 또한 카드뷰를 사용하여 내부 레이아웃의 디자인이 좀 더 둥글고 심플하게 변경할 수 있다. 바로 한번 확인해보자. 우선, layout1.xml 파일을 생성하여 다음과 같이 카드뷰를 삽입하고 그 내부에 레이아웃과 이미지 뷰 & 텍스트뷰를 넣어 구성해준다. ◎layout1.xml 이후에 LinearLayout을 상속 받은 Layout1.class 객체를 생성하고, layout1 레이아웃을 inflate 한다. 해당 객체가 생성됐을 때, 이미지와 텍스트를 set할 수 있도록 생성자를 구성한다. ◎Layout1.java packag..
안드로이드 API에서 제공하는 위젯을 사용하면 거의 대부분의 화면을 만들 수 있다. 하지만, 우리가 원하는 기능만 가진 커스텀 위젯을 따로 구상하여 새로운 뷰를 정의하는 것 또한 가능하다. API에서 제공하는 뷰를 사용하려면 API의 뷰를 상속해야 한다. 이 때 뷰의 영역과 크기는 해당 뷰를 포함하고 있는 레이아웃의 영향을 받아 정해지며, 개발자가 뷰의 상태에 따라 추가적인 코드를 넣을 수 있도록 콜백 메서드가 호출된다. 뷰가 스스로의 크기를 정할 때 자동으로 호출되는 메서드는 onMeasure()이고 스스로를 레이아웃에 맞게 그릴 때는 onDraw() 가 호출된다. 일반적으로 사용하는 뷰 객체의 콜백 메서드는 다음과 같다. public void onMeasure(int widthMeasureSpec, ..
- Async
- react
- Promise
- await
- 이탈리안 레스토랑
- 파니노구스토
- react-native
- 인천 구월동 맛집
- 맛집
- 정보보안기사 #실기 #정리
- redux-thunk
- redux
- 인천 구월동 이탈리안 맛집
- AsyncStorage
- javascript
- Total
- Today
- Yesterday