728x90

출처: https://rudalskim.tistory.com/141 [rudalskim]

 

 

Progaurd 설정 파일이 어떤 경우에는 proguard-android.txt를 사용하고, 

또 다른 경우는 proguard-android-optimize.txt를 사용하고 있었습니다.


 buildTypes {
        release {
            minifyEnabled true    // Set it to true in order to enable ProGuard
            
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            또는
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }

 

두 가지의 차이점이 궁금해서 검색해 보니 안드로이드의 platform SDK에서 발견할 수 있었습니다

차이점은 최적화 사용 유무에 따라 사용하지 않을 경우 proguard-android.txt를 사용하고, 최적화 옵션을 사용할 경우 proguard-android-optimize.txt를 사용하라고 되어 있습니다.

 

728x90
728x90

출처: https://kimyunseok.tistory.com/40

 

startActivityForResult() - Deprecated

 

변경전: A 액티비티와 B 액티비티가 있을 때,

startActivityResult메서드와 onActivityResult메서드를 사용해서 구현할 경우

  1. A -> B 실행, 메모리가 부족해서 A가 소멸됨.
  2. B 액티비티 종료 후 setResult() 메서드로 결과값 넘김
  3. A가 소멸됐다가 다시 생성돼서 B에게 결과값을 요청한 줄 모름.

변경후: ActivityResultLauncher객체와 registerForActivityResult()를 사용한 경우

  1. A -> B 실행, 메모리가 부족해서 A가 소멸됨.
  2. B 액티비티 종료 후 setResult() 메서드로 결과값 넘김

A가 다시 생성돼도 registerForActivityResult() 메서드가 다시 콜백을 등록해 줘서 결과값을 받아온다.

 

∴ ActivityResultLauncher객체와 registerForActivityResult()로 구현하면 됨

 

 

 

출처2:https://velog.io/@bonimddal2/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-ActivityResultLauncher%EB%A1%9C-startActivityForResult%EC%99%80-requestPermissions-%EB%8C%80%EC%B2%B4%ED%95%98%EA%B8%B0

출처3:https://aal-izz-well.tistory.com/entry/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C%EC%BD%94%ED%8B%80%EB%A6%B0-activityResultLauncherActivityForResult-%EB%8C%80%EC%B2%B4

 

우선 implementation을 해준다.

implementation 'androidx.activity:activity:1.3.0-alpha08'
implementation 'androidx.fragment:fragment:1.4.0-alpha01'

==> 나는 아래로 변경함

implementation 'androidx.activity:activity-ktx:1.4.0'
implementation 'androidx.fragment:fragment-ktx:1.4.1'


ActivityResultLauncher 사용법은 아래와 같다.

class MainActivity : AppCompatActivity(), View.OnClickListener {
    val binding by lazy { ActivityMainBinding.inflate(layoutInflater) }

    //ActivityResultLauncher<T>객체를 생성해주고 초기화 해준다.
    //T는 내가 호출할 엑티비티에서 결과값으로 받아올 자료형을 말한다.
    lateinit var activityResultLauncher: ActivityResultLauncher<Intent>
    val TAG = "MainActivity"
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(binding.root)

        binding.btnMain.setOnClickListener(this)

        //RegisterActivityResult(Contract자료형, 콜백메서드)를 이용해서
        //ActivityResultLauncher를 초기화 해준다.
        activityResultLauncher =
            registerForActivityResult(ActivityResultContracts.StartActivityForResult())
            {//Result 매개변수 콜백 메서드
                //ActivityResultLauncher<T>에서 T를 intent로 설정했으므로
                //intent자료형을 Result 매개변수(콜백)를 통해 받아온다
                //엑티비티에서 데이터를 갖고왔을 때만 실행
                if (it.resultCode == RESULT_OK) {
                    //SubActivity에서 갖고온 Intent(It)
                    val myData: Intent? = it.data
                    val address = it.data?.getStringExtra("KEY1") ?: ""
                    Log.e(TAG, address)
                }
            }


    }


    override fun onClick(v: View?) {

        when (v?.id) {
            //버튼을 누르면 메뉴 엑티비티가 실행되게 하였다.
            //launch메서드를 이용해 intent를 실행하고 새 엑티비티로부터 응답을받는다.
            //그리고 RequestCode가 사라졌다.
            binding.btnMain.id -> {
                val intent = Intent(applicationContext, SubActivity::class.java)
                activityResultLauncher.launch(intent)
            }

            else -> {


            }
        }


    }


}

 

class SubActivity : AppCompatActivity(), View.OnClickListener {
    val binding by lazy { ActivitySubBinding.inflate(layoutInflater) }
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(binding.root)
        binding.btnSub.setOnClickListener(this)
    }


    //버튼 클릭 리스너 메서드
    override fun onClick(v: View?) {
        when (v?.id) {
            binding.btnSub.id -> {
                val intent = Intent(applicationContext, MainActivity::class.java).apply {
                    //엑티비티에서 갖고올 데이터
                    putExtra("KEY1", "bbbbb")
                    //데이터 전달이 성공했을 때의 변수 값 저장
                    // Result_ok = -1 일 때 엑티비티에 전달된다.

                }
                setResult(RESULT_OK, intent)
                //엑티비티 종료
                if (!isFinishing) finish()
            }
            else -> {
            }
        }
    }

}

 

 

728x90
728x90

myBatis 반복문

 

open="("      : 반복시 '('로 시작

close=")"     : 반복시 ')'로 끝남

prepend       : 'WHERE' 과 같이 iterate 문 앞에 첨가

<select id="selectPostIn" parameterType="map">
  SELECT *
  FROM POST P
  WHERE ID in
  <foreach collection="list" item="item" index="index" 
      open="(" separator="," close=")">
        #{item}
  </foreach>
</select>

 

collection : 전달받은 인자값 이름(변수 이)

item : foreach 문 안에서 사용할 매개변수 이

separator : foreach 문이 한번 돌고 다음번 돌때의 구분자



Reference:

mingggu.tistory.com/71

java119.tistory.com/85

 

728x90
728x90

이클립스 실행하자마자 응답 없음에 걸릴 경우

 

 

1. STS실행파일과 같은 위치에 있는 'STS.init'파일에 본인 컴퓨터의 JAVA PATH를 추가

 

-vm

C:\Program Files\Java\jre1.8.0_171\bin\javaw.exe

 

(*vmargs 위에 추가)

 

 

2. 내가 해결본 방법

최근 실행한 프로젝트의 설정값이 남아서 에러가 나는 것이므로,

workspace를 재구성하기 위해 Package Explorer를 완전히 비우고(실제 소스파일들을 삭제하란 소리는 아님),

프로젝트 파일들을 다시 불러오자

 

 

 

estrella-0707.tistory.com/11

http://dev.azki.org/42

http://off-topic.biz/en/eclipse-hangs-at-startup-showing-only-the-splash-screen/

 

 

 

728x90

+ Recent posts