인터넷 속도도 문제 없고, 4070Ti로 사용하는데 디아4에 지연시간이 400이상이 생겨 이리저리 찾아보던중 해외사이트에서 해결 팁을 찾았다. !!

 

블리자드 런처에서:


1: 왼쪽 상단의 Battle Net Setting을 클릭합니다.
2: Settings(설정)을 클릭합니다.
3: Apps(앱)에서 Advanced Features(고급 기능) 섹션까지 스크롤합니다
4: "Use Browser Hardware Acceleration"(브라우저 하드웨어 가속 사용)이 선택되어 있는지 확인합니다.
5: Checked인 경우 클릭하여 선택을 취소합니다.
6: Restart 프롬프트를 클릭한 후 Launch the game으로 이동합니다.

 

 

요약하자면

배틀넷 설정에서 "Use Browser Hardware Acceleration"(브라우저 하드웨어 가속 사용) 선택 해제

재부팅 후 디아4에 접속하시면 됩니다.

 

Hilt에서는 Android 클래스 용이 아닌 일반 Class에서는 EntryPoint Annotation이 지원하지 않는다.


Interface만을 지원하기 때문에 아래와 같이 구현해야 한다.

@EntryPoint
    @InstallIn(SingletonComponent::class)
    interface TestInterface {
        fun adRequest(): AdRequest
    }


val hiltEntryPoint =
            EntryPointAccessors.fromApplication(context, TestInterface::class.java)



val adRequest = hiltEntryPoint.adRequest()
adView.loadAd(adRequest)



Singleton Class Module에 선언된 함수값을 사용할 수 있게 된다.

@Module
@InstallIn(SingletonComponent::class)
object AppModule {
    @Provides
    fun adRequest(): AdRequest {
        val testDeviceIds: List<String> = listOf(
            "ABC"
        )
        val configuration = RequestConfiguration.Builder().setTestDeviceIds(testDeviceIds).build()
        MobileAds.setRequestConfiguration(configuration)

        return AdRequest.Builder().build()
    }
}

 

다수의 PC에서 작업을 하기때문에 

 
클라우드의 이점을 활용하고자 Dropbox로 GitHub내 소스를 관리하는 편인데 
 
프로젝트가 늘어날 경우 용량제한 문제로 업로드가 실패하는 경우가 있다. 
 
이 경우 소스 파일을 정리해야한다.

 

이 경우 Android Compile시에 생성되는 Build폴더 내 파일만 삭제해도 상당수의 용량을 확보할 수 있다.

 

 

FOR /F %I in ('DIR /S /B /A:D \build') DO RD /S /Q %I

 

Build폴더를 자동 삭제하도록 위 Batch 커멘드를 사용하고 있다.

 

Dropbox에서 제공하는 기본용량 15.9G 중 13.3G면 충분히 버틸만하다

최대한 무료로 사용해보자!

'개발 > 기타' 카테고리의 다른 글

VirtualBox Ubuntu16.04 클립보드 공유  (0) 2017.11.01

구글에서 유료앱을 등록하고 판매가 되면 결제 프로필을 등록해야만 지급을 받을 수 있다.

 

1. 결제프로필 등록

 - 구글 플레이 스토어에 설정 - 결제 프로필 항목에서 작성을 하면 된다.

 






 

2. 신원확인

 - 이 부분부터가 시간이 오래걸리는 항목인데

  2. 1. 주소지 증빙

   - 오프라인 지로(공공요금, 신용카드 명세서, 은행, 임대계약서 등)를 스캔하여 업로드 해야       한다.



 2. 2. 은행계좌증빙자료

    - 은행 도장이 찍힌 입출금내역서를 제출하면 된다. 

    - 창구방문이 어려운경우는, 온라인상에서 은행 도장이 찍힌 통장증빙서류(통장사본, 입출금내역서 등)를 첨부하면 된다.

   ※ 저의 경우는 온라인으로 진행하였고, 입출금내역서 및 등본도 첨부하였습니다. (주민등록번호 뒷자리 마스킹)



3. 기다림

  - 정상적으로 제출을 했으면 이제 무제한 기다림을 하면된다.

  - 저의 경우 정상 지급을 받기 까지 한달정도 소요가 되었습니다.



 

 

Android Project Import 후 Gradle Build시 처음엔 하단의 에러가 발생했다. 

warning: Kotlin runtime JAR files in the classpath should have the same version

 

이에 상세한 에러를 확인하기 위해 아래 명령어를 쳤더니 아래오류를 발견하였다. 

./gradlew assemble --stacktrace

unrecognized Attribute name MODULE (class com.sun.tools.javac.util.SharedNameTable$NameImpl)

 

 

Android Studio Gradle 설정에서 Gradle JDK버전을 JDK11로 맞춰주면 된다.

Settings > Build, Execution, Deployment > Build Tools > Gradle > Gradle JDK

 

 

 

 

 Android Project를 Import하는데에 아래와 같은 오류가 발생하였습니다.

 

Cause: com/android/tools/idea/gradle/run/OutputBuildAction has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0

 

문제는 Java Runtime JRE에 있습니다. 이 Java Runtime의 버전은 52에서 컴파일 되었다는 메세지 입니다. 

 

Android Stuidio의 설정을 수정하여 해결했습니다. 

 

1. Android Studio   -> Preferences -> Build, Execution, Deployment -> Build Tools -> Gradle

 

Gradle JDK버전은 Android Studio default JDK로 변경 후 재컴파일

 


Layout작업시에 부모Scroll과 중첩되어 의도된 Child의 Scroll이 안되는 경우가 많습니다.


이럴경우는 안되는 스크롤의 내부 Touch Event를 Override하여 requestDisallowInterceptTouchEvent 메소드를 요청하여 처리하는것이 
일반적입니다.


Webview가 Child일경우 방법은 하단의 2가지입니다.

1.새로운 WebView Class




class CustomWebView : WebView {

    constructor(context: Context) : super(context) {}

    constructor(context: Context, attrs: AttributeSet) : super(context, attrs) {}

    constructor(context: Context, attrs: AttributeSet, defStyle: Int) : super(context, attrs, defStyle) {}

    override fun onTouchEvent(event: MotionEvent): Boolean {
        requestDisallowInterceptTouchEvent(true)
        return super.onTouchEvent(event)
    }
}


  • 새로운 Class를 활용할경우 Layout Xml에서 Webview에신 해당 Class로 정의를 해줘야 합니다.

<packagename.CustomWebView
    android:id="@+id/webView"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

2.WebView TouchEvent override

이방법은 Activity Class내에 Webview의 TouchListner Interface를 활용하는 방법입니다. 

    webView.setOnTouchListener { v, event ->
        val wv = v as WebView
        wv.requestDisallowInterceptTouchEvent(true)
        return@setOnTouchListener false
    }


Activity


이 Activity클래스는 Android 앱의 중요한 구성 요소이며, 액티비티가 시작되고 결합되는 방식은 플랫폼의 애플리케이션 모델의 기본 요소입니다.  

Activity가 시작되고 종료되는 일련의 생명주기에 따라 어떠한 방식으로 앱을 구현하고 처리해야 되는 지 달라집니다.

Fragment와 같이 Activity는 화면을 이루는 가장 기본적이 단위이며 사용자에게 주로 보여지는 UI입니다.









onCreate ()

시스템이 처음 활동을 생성 할 때 발생하는이 콜백을 구현해야합니다. 

Activity 활동의 단 한 번만 발생해야하는 기본 응용 프로그램을 수행합니다. 

또한 savedInstanceState 파라미터를 변수로 받습니다. savedInstanceState는 Bundle 이전에 저장된 활동의 상태를 포함 하는 객체입니다. 

onStart ()

액티비티가 Started 상태가되면 시스템은이 콜백을 호출합니다. 
onStart는 앱이 UI를 유지 관리하는 코드를 초기화하는 곳입니다. 

onResume ()

이것은 앱이 사용자와 상호 작용하는 상태입니다. 앱이 화면내에서 유지될때까지 onResume상태로 유지됩니다. 


하지만 전화 통화를 수신하거나 사용자가 다른 활동으로 이동하게되면 화면이 꺼집니다. 이러한 인터럽트 이벤트가 발생하면 앱은 Paused 상태가되고 시스템이 onPause()콜백을 호출합니다 .


onPause ()

사용자가 앱이 일시중지 될경우 이 메소드를 호출합니다. 일시중지 될경우 앱이 종료되지는 않습니다. 

onStop ()

사용자가 더 이상 활동을 볼 수 없으며 Stopped 상태가되어 시스템이 onStop()콜백을 호출합니다 . 

onDestory()

Activity가 종료되기전에 호출됩니다. 이것은 활동주기에 호출하는 최종메소드입니다.
사용자의 finish()호출로 종료될 수 있으며 시스템은 프로세스를 종료시키기 위해 이 콜백을 호출합니다.




    //Activity LifeCycle
@Override protected void onCreate(Bundle savedInstanceState) { } @Override protected void onStart() { }
@Override protected void onResume() { } @Override protected void onPause() { } @Override protected void onStop() { } @Override protected void onDestory() { }


# VirtualBox Ubuntu16.04 와 Windows10에서의 Clipboard 공유하기

1.Guest Additional 설치
2.Ubuntu terminal에서 하단 Command 실행
killall VBoxClient
VBoxClient-all


'개발 > 기타' 카테고리의 다른 글

Dropbox 에서 Android 프로젝트 불필요한 파일 삭제  (0) 2023.10.18



Dagger2

Dagger2는 자바와 안드로이드를위한 완전히 정적 인 컴파일 타임 의존성 주입 프레임 워크입니다. 이것은 구글에 의해서 만들어졌습니다.




Dagger2 Android

안드로이드 용으로 작성된 코드는 자바 소스이지만, 종종 스타일 측면에서 상당히 다르다. 일반적으로 이러한 차이점 은 모바일 플랫폼 의 고유 한 성능 고려 사항을 수용 하기 위해 존재합니다 .




기존Dagger의 문제

public class FrombulationActivity extends Activity {
  @Inject Frombulator frombulator;

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ((SomeApplicationBaseType) getContext().getApplicationContext())
        .getApplicationComponent()
        .newActivityComponentBuilder()
        .activity(this)
        .build()
        .inject(this);
  }
}

  1. 코드를 복사하여 붙여 넣으면 나중에 리팩터링하기가 어렵습니다. 점점 더 많은 개발자가 해당 블록을 복사하여 붙여 넣기 때문에 실제 블록이 무엇인지 알 수있는 사람이 줄어 듭니다.
  2. 더 근본적으로, injector에 대해 알기 위해서는 injection ( )을 요구하는 타입이 필요합니다 . 비록 이것이 구체적인 타입 대신에 인터페이스를 통해 이루어 지더라도, 의존성 주입의 핵심 원칙을 깨뜨립니다. 즉 클래스는 그것이 주입되는 방법에 대해 아무것도 알지 못해야 합니다.

Usage

Google Support Library를 사용하신다면 'com.google.dagger:dagger-android-support:2.11'를 추가해주시면됩니다.

gradle은 annotationProcessor를 지원하는 3.0 이상버전으로 Upgrade

이하로 사용하시고 있다면 android-apt를 사용하시면 됩니다.


dependencies {
    compile 'com.google.dagger:dagger-android:2.11'
    compile 'com.google.dagger:dagger-android-support:2.11' // if you use the support libraries
    annotationProcessor 'com.google.dagger:dagger-android-processor:2.11'
    annotationProcessor 'com.google.dagger:dagger-compiler:2.11'
}






Application 설정

HasActivityinjector를 implement 한후에 activityInjector를 override 합니다.
class UILApplication : Application() , HasActivityInjector {
    @Inject lateinit var activityInjector: DispatchingAndroidInjector<Activity>

    override fun activityInjector(): AndroidInjector<Activity> {
        return activityInjector
    }

    override fun onCreate() {
        super.onCreate()
        DaggerAppComponent.builder()
                .application(this)
                .build()
                .inject(this)
    }
}





AppComponent 설정

AppCompoent에서 AppModule 뿐아니라 ActivityBuilder,AndroidInjectionModule을 Component Annotation으로 연결합니다.

Dagger2버전에서의 Activity component들이 ActivityBuilder로 대체되었다고 생각하시면 됩니다.


@Singleton
@Component(modules = arrayOf(
        AndroidInjectionModule::class,
        AppModule::class,
        ActivitiesBuilder::class
))
interface AppComponent {
    @Component.Builder
    interface Builder {
        @BindsInstance
        fun application(application: Application): Builder
        fun build(): AppComponent
    }


    fun inject(app: UILApplication)
}


ActivitiesBuilder 설정

각 ActivityModule을 설정합니다. 저는 Splash화면의 ActivityModule만 매칭하였습니다.
@Module
abstract class ActivitiesBuilder {

    @ContributesAndroidInjector(modules = arrayOf(SplashActivityModule::class))
    internal abstract fun bindMainActivity(): SplashActivity
}





AppModule 설정

Application에서 공통으로 사용하는 객체를 Provider합니다.

@Module
class AppModule {

    @Provides
    @Singleton
    fun provideContext(application: Application): Context {
        return application
    }


    @Provides
    @Singleton
    fun appExcuter(): AppExecutors{
        return AppExecutors()
    }

}



Activity Injection주입

해당 Activity에서 직접 Inject해도 되지만 BaseActivity에서 공통으로 Inject하게되면 별도로 Child Activity inject에 대한 코드를 적어주지 않아도 됩니다.

class BaseActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        AndroidInjection.inject(this)
        super.onCreate(savedInstanceState)
    }
}




[Reference]

https://github.com/codepath/android_guides/wiki/Dependency-Injection-with-Dagger-2

https://google.github.io/dagger/android.html





+ Recent posts