728x90

SurfaceView View를 상속받은 클래스로 Video Memory로 바로 접근하기 때문에 일반 View에서의 랜더링 

속도보다 빠르다.

일반 View는 많은 그리기 작업을 하면 메인 스레드의 자원을 다 잡아먹어버리기때문에 상당히 느려지게 되는데

이러한 단점을 보완하기 위한 클래스라고 보면 된다

 

 

SurfaceView로부터 상속받을 경우 디폴트로 구현해야 할 메소드가 있다.

 

  • public void onDraw (Canvas canvas) : 화면을 그린다.
  • public void surfaceChanged() : 뷰가 변경될 때 호출된다.
  • public void surfaceCreated() : 뷰가 생성될 때 호출된다.
  • public void surfaceDestroyed() : 뷰가 종료될 때 호출된다.

 

그럼 셋팅은 끝. 사용되는건 surfaceCreated surfaceDestoryed 정도가 되겠다.

surfaceCreated는 처음 서피스뷰가 생성될 때 호출되는데, 주의할점은 백그라운드 상태로 내려갔다가, 다시 올라오게 되면

surfaceview가 다시 created된다는점이다. created에서 thread를 실행시키는 작업을 할 경우

반드시 스레드가 동작중인지 여부를 먼저 확인해야한다. 그렇지않으면 익셉션 발생

 

surfaceChanged는 업데이트를 대비해 만들었다, 뭐라뭐라 하던데 잘 모르겠다. 사용하지않는듯하다.

 

이제 SurfaceView 구성은 하였고, 실시간으로 그리기를 실행하려면 Thread를 구동해야한다.

 

private Class PaintThread extends Thread {

public void run() {

while(!this.isInterrupted()){    //스레드가 인터럽트 될 때까지 반복 실행.

if (그리기 실행조건) {

//그리기 실행

doDraw();

}

}

}

}


Reference

- https://biig.tistory.com/23

 

SurfaceView 구현 / 사용법

SurfaceView는 View를 상속받은 클래스로 Video Memory로 바로 접근하기 때문에 일반 View에서의 랜더링 속도보다 빠르다. 일반 View는 많은 그리기 작업을 하면 메인 스레드의 자원을 다 잡아먹어버리기때문에 상..

biig.tistory.com

https://blog.naver.com/muri1004/221054311714

 

[Android] SurfaceView 개념 및 예제

SurfaceView 란?SurfaceView는 View를 상속받는 클래스이다.일반 View는 onDraw 메소드를 시스템에...

blog.naver.com

 

728x90
728x90

 

ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);

 

AndroidX Migration을 진행한 후에,

위와 같은 binding 부분에서 에러가 발생할 경우가 간혹 있다.

빨간줄에 에러를 확인해보면 ' Type parameter T has incompatible upper bounds : ViewDataBinding ~' 이런건데,

 

Build -> Clean Project
Build -> Rebuild Project

File -> Invalidate Caches/Restart...

귀찮아도 이 단계를 거치고 프로젝트를 다시 시작하면 해결 된다.

 

 

 

Reference

https://stackoverflow.com/questions/34368329/data-binding-android-type-parameter-t-has-incompatible-upper-bounds-viewdata

 

Data Binding Android - Type parameter T has incompatible upper bounds : ViewDataBinding and MainActivity

I am using Android Studio 2.0 Preview 4. I'm using Android SDK tools 25 rc1. This error persists no matter how many times I clean / rebuild project. File->Invalidate Caches and restart also doesn't...

stackoverflow.com

 

728x90
728x90

[현상]

1. 나는 2개의 Calendar 객체를 각기 다르게 셋팅해서, 두 객체를 after 메소드로 비교하려고 했다.

2. A 객체는 SimpleDateFormat을 사용하여 setTime()로 날짜를 설정했고

3. B 객체는 set()만 사용하여 날짜를 설정하려고 했다.

 

한마디로 아래와 같은 상황인데

    Calendar calendarA = Calendar.getInstance();
    calendarA.set(year, monthOfYear, dayOfMonth, 0, 0, 0);

    Calendar calendarB = Calendar.getInstance();
    calendarB.setTime(dateformat.parse(specificDateStr));
    calendarB.set(Calendar.HOUR_OF_DAY, 0);
    calendarB.set(Calendar.MINUTE, 0);
    calendarB.set(Calendar.MILLISECOND, 0);

    if (calendarA.after(calendarB)) {
    	//비교했을 때 수행하려는데... 문제는...	
    }

 

예를 들어 오늘이 2019-09-20일 때,

calendarA는 2019-09-18로 설정하고, calendarB는 2019-09-19로 설정하려고 한다면,

after()메소드로 두 객체를 비교하려는 부분에서

calendarB는 19일이지만, A는 20일로 getInstance했을때의 초기값인 오늘로 설정된다는 것이었다.

 

DatePickerDialog를 쓰려고 하다보니 DateSet에서는 int값3개인데 굳이 그걸 또 setTime()으로 쓰기엔 번거로운 면이 있어서

set() 메소드를 써야하는데 이런 결과를 주니까 ?????인 상태

 

    Calendar calendarA = Calendar.getInstance();
    calendarA.set(year, monthOfYear, dayOfMonth, 0, 0, 0);
    calendarA.getTime(); // 어째서인지 강제로 업데이트해주는 식으로 getTime()메소드를 해줘 갱신되었다

    Calendar calendarB = Calendar.getInstance();
    calendarB.setTime(dateformat.parse(specificDateStr));
    calendarB.set(Calendar.HOUR_OF_DAY, 0);
    calendarB.set(Calendar.MINUTE, 0);
    calendarB.set(Calendar.MILLISECOND, 0);

    if (calendarA.after(calendarB)) {
    	//비교했을 때 수행하려는데... 문제는...	
    }

 

그래서 디버깅 연결하면서 로그를 찍어보려고, 위처럼 한번 getTime()을 했더니, 갱신이 되었다.

원래 이렇게 써야했던건가..? 내가 기초가 부족했던건가??? 싶어서 멘붕이 왔는데,

나와 같은 아래의 질문을 가진 사람과 답변이 있는 stackoverflow QnA를 발견...

직렬화 어쩌고 버그같은데...

 

https://stackoverflow.com/questions/1407007/is-calling-javas-calendar-gettime-necessary-to-update-the-object

 

Is calling Java's Calendar.getTime() necessary to update the object?

I came across a comment in some java code that states that getTime() needs to be called to update the Calendar object. Is this true? I cannot find anything that says that this is necessary. Here's...

stackoverflow.com

728x90

'Dev > Java' 카테고리의 다른 글

RxJava 이해  (0) 2020.02.03
[Java] Java SE, EE, ME, FX의 차이  (0) 2019.10.16
[Java] Singleton Pattern 사용시  (0) 2018.10.02
728x90

*본 글은 아래의 글 중 일부를 발췌, 번역한 글입니다.

https://www.androidly.net/223/android-intent-handling-between-activities-using-kotlin

 

 

1. 전달

- 도착 액티비티 입력시, activity::class.java 형식으로 입력 (subActivity.class가 아님)

 

class MainActivity : AppCompatActivity() {
   override fun onCreate(savedInstanceState: Bundle?) {
      super.onCreate(savedInstanceState)
      setContentView(R.layout.activity_main)

	button.setOnClickListener {
         val intent = Intent(this, subdActivity::class.java)
         intent.putExtra("keyString", "Androidkey")
         startActivity(nextIntent)  
      }
   }
}

 

putExtra에는 다음과 같이 다양하게 전달 가능

2. 이동한 subActivity 수신

val bundle: Bundle? = intent.extras
val string: String? = intent.getString("keyString")
val myArray: ArrayList<String>? = intent.getStringArrayList("myArray")

 

 

3. Parcelable 혹은 Serializable Data 전달

1) Parcelable과 Serializable의 차이

 (1)  Parcelable은 Android SDK의 Interface
      Serializable은 Java Interface

 (2)  Parcelable은 Parcel object안에 필요로 하는 데이터의 종류가 다 있으며, writeToParcel()메소드로 override 가능함
      Serializable은 원하는 object를 구현해야함

 (3) Parcelable이 Serializable보다 빠름

 

 

2) Parcelable Data 전송

Kotlin에서는 writeToParcel() 메소드로 override할 때 @Parcelize annotations을 제공함

@Parcelize
data class Student(
        val name: String = "Anupam",
        val age: Int = 24
) : Parcelable

 

@Parcelize annotation를 사용하기 위해서는 build.gradle에  다음과 같이 추가해야함

android {
    androidExtensions {
        experimental = true
    }
//..
....
}
val student = Student()
val intent = Intent(this, OtherActivity::class.java)
intent.putExtra("studentData", student)
startActivity(intent)

 

3) Serializable Data 전송

data class Blog(
   val name: String = "Androidly", 
   val year: Int = 2018
) : Serializable


val blog = Blog("a", 1)
val intent = Intent(this, OtherActivity::class.java)
intent.putExtra("blogData", blog as Serializable)
startActivity(intent)

 

 

 

 

Reference

https://www.androidly.net/223/android-intent-handling-between-activities-using-kotlin

 

Android Intent Handling Between Activities Using Kotlin - Androidly

In this tutorial, we’ll be discussing Android Intents and implement them using Kotlin in our application. What Will You Learn? What are Intents? Types Of Intents? Using Intents Between Activities Sending Data Using Android Intents Using Parcelable and Seri

www.androidly.net

 

 

 

728x90

+ Recent posts