2017년 5월 20일 토요일

[STUDY] RxAndroid Part 3 (메모리 누수 - RxLifecycle, compose / CompositeSubscription)


[목차]==================================================
1. Rxandroid 메모리누수
2. RxLifecycle 사용법(compose)
3. RxJava의 Lifecycle 사용방법 - CompositeSubscription
4. MVP 패턴에서의 CompositeSubscription
======================================================

1. Rxandroid 메모리누수
  • Rxandroid 는 메모리누수에 대한 문제점이 있는데,
    Observable이 Context를 복사해서 유지하고 있기 때문에 엑티비티가 종료 될때 unsubscribe하지 않으면 안된다기본 예제에서는 명시적으로 onPause 나 onDestory에 명시적으로 unsubscribe()를 호출하도록 되어 있다.(참고로 정상적으로 onComplete()나 onError()콜백으로 진입 하게 되면 알아서 unsubscribe()된다)
  •  => 이러한 부분을 쉽게 사용하기 위해서 RxLifecycle 라이브러리를 사용하면 쉽게 사용 할 수 있다.
2. RxLifecycle 사용법(compose)
  • Activity의 상속을 RxAppCompatActivity으로 변경하고 compose를 사용하여 Rxlifecycle을 적용해 줍니다.
  • onCreate 에서 subscribe을 하면 onDestory 에서 자동으로 unsubscribe 되고 onResume 에서 subscribe을 하면 onPause 에서 자동으로 unsubscribe 됩니다.
  • 만약에 종료되는 시점은 바꾸고 싶다면 직접 bindUntilEvent 선언하여 조정할 수 있습니다.
  • 프로젝트에 의존성 추가





package tiii.com.rxandroid;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
import com.trello.rxlifecycle.ActivityEvent;
import com.trello.rxlifecycle.components.support.RxAppCompatActivity;
import rx.Observable;
import rx.Subscriber;
public class MainActivity extends RxAppCompatActivity {
    public static final String TAG = MainActivity.class.getSimpleName();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Observable<String> simpleObservable =
                Observable.create(new Observable.OnSubscribe<String>() {
                    @Override
                    public void call(Subscriber<? super String> subscriber) {
                        subscriber.onNext("Hello RxAndroid !!");
                        subscriber.onCompleted();
                    }
                })
                // `this.<String>` is necessary if you're compiling on JDK7 or below.
                //
                // If you're using JDK8+, then you can safely remove
                .compose(this.<String>bindToLifecycle());
                //.compose(this.<String>bindUntilEvent(ActivityEvent.DESTROY));


        simpleObservable.subscribe(new Subscriber<String>() {
            @Override
            public void onCompleted() {
                Log.d(TAG, "complete!");
            }
            @Override
            public void onError(Throwable e) {
                Log.e(TAG, "error: " + e.getMessage());
            }
            @Override
            public void onNext(String text) {
                ((TextView) findViewById(R.id.textview)).setText(text);
            }
        });
    }
}

3. RxJava의 Lifecycle 사용방법 - CompositeSubscription
  • RxJava에는 CompositeSubscription이라는 클래스를 제공 한다. 이 클래스는 생성된 Subscription인스턴스를 하나로 관리 해주는 클래스 이다.
  • CompositeSubscription클래스의 remove()메소드를 보면, Removes a Subscription from this CompositeSubscription, and unsubscribes the Subscription.이라고 되어 있다. 이 CompositeSubscription에 add()된 Subscription에 remove()메소드를 콜하면 CompositeSubscripnt에서 제거 되면 동시에 unsubscribe된다고 명시 되어 있다
    Activity나 Fragment등의 onCreate()메소드 에서는 멤버변수로 존재 하는 CompositeSubscription인스턴스를 생성 하는 기능이 들어 간다.
  • 어떠한 작업을 위해서 subscribe()를 하게 되면 Subscription인스턴스를 변수로 정의 한 다음 CompositeSubscription에 add()해 준다. Activity나 Fragment등의 onDestroy()메소등에서는 생성된 인스턴스로 존재 하는 CompositeSubscription인스턴스를 unsubscribe()한다. Activity나 Fragment에서 생성되어지고 add()된 모든 Rx의 subscribe들은 이제 unubcribe()될 것 이다.
 public class MainActivity
    extends Activity {
  private CompositeSubscription compositeSubscription;
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    compositeSubscription = new CompositeSubscription();
    Observable<String> observable = Observable.create(
        (Observable.OnSubscribe<String>) subscriber -> {
          ...
        }
    );
    Subscription subscription = observable
        .observeOn(Schedulers.computation())
        .subscribeOn(AndroidSchedulers.mainThread())
        .subscribe(
            s -> {
              ...
            }
        );
    compositeSubscription.add(subscription);  }
  @Override
  protected void onDestroy() {
    if (compositeSubscription != null) {
      compositeSubscription.unsubscribe();
    }

    super.onDestroy();
  }
}

4. MVP 패턴에서의 CompositeSubscription
  • 위의 3번 방법에서는 Activity나 Fragment에 바로 Subscription을 생성하고 멤버변수로 CompositeSubscription을 생성하여 add(), unsubscribe()하는 것을 알 수 있다.
  • 하지만, MVP패턴에서는 Subscription을 실제로 생성하고 비동기 작업을 요청 하는곳이 Activity나 Fragment가 아닌 Presenter에서 하게 된다. Presenter에 CompositeSubscription을 멤버로 두고 관리하게 하는건 무리가 없을것이다. 하지만 Activity나 Fragment의 Lifecycle에 맞추어 Subscription을 관리 하려 하는 목적에 어긋난다.
  • 아래 소스는 Presenter의 부모 클래스로서 CompositeSubscription에 Subscriber를 등록 하고 destroy()메소드를 액티비티나 프래그먼트의 라이프 사이클에 맞추어 콜 하는 그 예 이다.
 public class BasePresenter {
  private CompositeSubscription compositeSubscriptionl;

  public BasePresenter() {
    this.compositeSubscriptionl = new CompositeSubscription();
  }

  public <T> void addSubscriber(@NonNull Subscriber<T> subscriber) {
    if (compositeSubscriptionl != null) {
      compositeSubscriptionl.add(subscriber);
    }
  }

  public void destroy() {
    if (compositeSubscriptionl != null) {
      compositeSubscriptionl.unsubscribe();
    }
  }
}
1) Presenter의 부모 클래스를 만들고 CompositeSubscription의 멤버변수를 추가 한다.
2) 부모 클래스의 생성자에서는 CompositeSubscription의 인스턴스를 생성 한다.
3) 부모 클래스에는 만들게 될 Subscriber의 인스턴스를 add()하는 메소드와 lifecycle의 onDestroy()에 맞춰 unsubscribe()하는 메소드인destroy()`메소드를 추가 한다.
4) 앞으로 만들게 되는 모든 Presenter들은 부모 Presenter를 상속해서 만든다.
5) 그리고 Activity나 Fragment를 상속한 부모 클래스들을 또 만들고, onCreate()메소드 군 에서는 presenter의 인스턴스를 생성 한다.
6) 또한 onDestroy()에서는 presenter의 destroy()메소드를 꼭 호출 하여 생성된 모든 Subscription을 unsubscribe()하게 해 준다.
이러한 부분이 번거롭다면, 그냥 Trello에서 개발 한 RxLifecycle을 사용 하자!





 
출처 : 인터넷에서 RxAndroid 검색하여 필요한 정보를 다양한 사이트에서 종합하여 작성된 것입니다. 많은 사이트 내용을 종합하여 공부하여 작성하다보니 일일이 나열하지 못하였습니다. ㅈㅅ(_ _) 이글은 자유롭게 퍼 가셔서 도움이 되었으면 좋겠습니다. 감사합니다. 

[STUDY] RxAndroid Part 2 (개념 - Gradle 설정/Rx핵심개념 : Observable,Subscriber, Subscription , Scheduler )

[목차]==================================================
1. Gradle 설정
2. Rx의 핵심개념
Observable
Subscriber
Subscription
Scheduler
======================================================


 
1. Gradle 설정
안드로이드 스튜디오에서 프로젝트를 만들고 app 디렉토리의 build.gradle 파일을 열어 봅시다.
dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.1.1'
    compile 'io.reactivex:rxandroid:1.1.0'
}
Gradle 설정에서 가장 중요한 부분은 의존성입니다.
안드로이드도 자바 환경이기 때문에 rxjava를 포함하지 않는 것에 의아할 수 있습니다. RxAndorid는 RxJava에 대한 의존성을 가지고 있고 RxAndroid를 의존성에 포함하면 안드로이드 개발 환경에 문제가 없습니다. 혹시 새로운 버전을 적용하길 원한다면 명시적으로 지정할 수 있습니다.
지금은 Rxandroid는 1.1.0 이고 Rxjava는 1.1.1 이라 별도로 의존성을 추가해 줬다.
그리고 build.gradle 파일을 동기화 해주면 적용은 끝난다. 
1.0 이하 버전에서는 각종 컴포넌트의 이벤트를 처리 부분이 포함되어 있었으나
라이브러리의 경량화와 유지보수등의 문제로 서드파티 라이브러리로 빼버렸다고 한다. 아래 외에도 다양한 라이브러리가 있으니 gitHub를 찾아보면 됨
RxLifecycle - Lifecycle handling APIs for Android apps using RxJava
RxBinding - RxJava binding APIs for Android's UI widgets.SqlBrite - A lightweight wrapper around SQLiteOpenHelper and ContentResolver which introduces reactive stream semantics to queries.Android-ReactiveLocation - Library that wraps location play services API boilerplate with a reactive friendly API.rx-preferences - Reactive SharedPreferences for Android
2. Rx의 핵심개념
  • Observable 아이템을 발행하는 일
  • Subscriber(Observer) 발행한 아이템을 소비 / Subscriber는 onNext() , onComplete(), onError()를 각각 가지고 있는데, onNext()는 여러번 호출 될 수 있고 이후에 onComplete(), onError()이 처리 / Observable 안에는 Subscriber를 가지고 있어서 onNext를 호출하면 다음에 있는 Observable 이나 Subscriber가 받을 수 있음
  • Subscription : Observable이 방출한 아이템을 Observer가 구독해서 반응을 합니다. 바로 이 때 Observable과 Observer의 연결을 Subscription을 통해서 이루어 집니다.
  • Scheduler : 멀티쓰레드, 비동기 방식 등에 유용하며, Scheduler는 해당 Observable, Operator, Subscriber를 어떤 스레드에서 수행할지 결정하는 것입니다. 스케줄러가 어떤 부분을 맞게 되는지는 subscribeOn과 observeOn으로 지정합니다
  • Observable과 Subscriber를 주목
데이터의 강을 만드는 Observable과 강에서 데이터를 하나씩 건지는 Subscriber가 리액티브 프로그래밍의 가장 핵심적인 요소입니다. Observable은 데이터를 제공하는 생산자로 세가지 유형의 행동을 합니다.
onNext - 새로운 데이터를 전달한다.
onCompleted - 스트림의 종료.
onError - 에러 신호를 전달한다

package io.realm.simpleobservable;

import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.util.Log;
import android.widget.TextView;

import rx.Observable;
import rx.Subscriber;

public class MainActivity extends ActionBarActivity {
    private static final String TAG = MainActivity.class.getName();

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Observable<String> simpleObservable =
                Observable.create(new Observable.OnSubscribe<String>() {
                    @Override
                    public void call(Subscriber<? super String> subscriber) {
                        subscriber.onNext("Hello RxAndroid !!");
                        subscriber.onCompleted();
                    }
                });

        simpleObservable
                .subscribe(new Subscriber<String>() {
                    @Overridea
                    public void onCompleted() {
                        Log.d(TAG, "complete!");
                    }

                    @Override
                    public void onError(Throwable e) {
                        Log.e(TAG, "error: " + e.getMessage());
                    }

                    @Override
                    public void onNext(String text) {
                        ((TextView) findViewById(R.id.textView)).setText(text);
                    }
                });
    }
}

 


출처 : 인터넷에서 RxAndroid 검색하여 필요한 정보를 다양한 사이트에서 종합하여 작성된 것입니다. 많은 사이트 내용을 종합하여 공부하여 작성하다보니 일일이 나열하지 못하였습니다. ㅈㅅ(_ _) 이글은 자유롭게 퍼 가셔서 도움이 되었으면 좋겠습니다. 감사합니다. 

[STUDY] RxAndroid Part 1 (개요 - Rx등장/이해 등)



[목차]==================================================
1. Rx(Reactive Extensions)의 등장
2. Rx을 이해하기 위한 준비
3. Rx를 어디에 적용하고 사용할 수 있을까?
======================================================


1. Rx(Reactive Extensions)의 등장

여러 이슈를 처리해줄 적절한 도구는 닷넷 진영에서 등장했습니다. 마이크로소프트는 옵저버 패턴과 LINQ 스타일 문법을 확장하여 비동기처리와 이벤트 기반 프로그래밍을 할 수 있다는 것을 발견하고 연구진은 이를 정립하여 반응형 확장(Rx, Reactive Extensions)을 공개하였습니다.

반응성 확장은 곧 여러 기술 기반 회사들의 호응을 얻었다. 넷플릭스(Netflix)는 Rx를 자바(RxJava) 환경에 옮겼고, 사운드클라우드(SoundColud)의 마티아스 캐플러(Matthias Käppler)는 RxJava를 안드로이드까지 (RxAndroid) 확장합니다.


2. Rx을 이해하기 위한 준비
  • RX는 Observer patternIterator pattern과 함수형 프로그래밍으로부터 나온 최고의 아이디어 조합이다
  • CREATE(만들고)’, ‘COMBINE(조합하고)’, ‘LISTEN(들어라? - 소비하라가 맞겠죠?)’
  • 일단 Rx를 제대로 이해하기 위해서는 아래 항목을 알고 있다면 쉽게 이해가 될거다.
observer pattern
Iterator pattern
Functional programming
MVVM model
Dataflow programming

3. Rx를 어디에 적용하고 사용할 수 있을까?
  • 비동기 통신을 순차적으로 보내고 싶다. (A작업이 끝나고 B가 시작됐으면 좋겠다.)
  • 콜백을 받았는데 받는 화면이 사라져서 null에러를 뿜으면서 죽는다.
  • 핸들러랑 콜백 지옥에 빠져서 디버깅도 힘들고 햇깔린다.
  • 두개의 비동기 처리가 완료된 후에 결과 값을 합쳐서 하나로 만들고 싶다.
  • 버튼을 연타로 눌러서 이벤트가 중복실행 된다.
  • 쓰레드 관리가 힘듭니다.

출처 : 인터넷에서 RxAndroid 검색하여 필요한 정보를 다양한 사이트에서 종합하여 작성된 것입니다. 많은 사이트 내용을 종합하여 공부하여 작성하다보니 일일이 나열하지 못하였습니다. ㅈㅅ(_ _) 이글은 자유롭게 퍼 가셔서 도움이 되었으면 좋겠습니다. 감사합니다. 

2011년 2월 28일 월요일

[Android Course][English][Theme] - Android Eclipse "Proguard" use




※ Proguard ?
: "Code obfuscation" Tool by, the various symbols used in the code generated by the machine's name is short, replace the name change.
 
Therefore, the attacker dontAllow () method is used instead of the information that a () uses a method that will give information only. Thus, the attacker does not see the original source code of each method to perform a task that is difficult to notice on a hunch
: It was personal it was a commercial Android dex tool because it uses Java code and the jad tool and you can decompile and reverse engineering is over. To solve this problem by using the code tools I Tues dock to make it difficult to reverse will be used. proguard nandokyi depending on how the coding, but there is nothing that can be decrypted is not possible.

1. Install the latest version of ADT
: "Window -> Android SDK and AVD Manager" and install the latest version through.
: First of course you are currently using the latest version of ADT (after version 8.0.1) must be installed. If you have already installed the latest version of ADT are you an update. ADT is equivalent to update the application to determine the target platform, no matter what we do not have big worries about compatibility updates You may boldly without.

2. Create a new project
- "Eclipse" from the "File> New> Android Project" on creating a new project by choosing (2 files in the root folder of the project generated) : "Proguard.cfg" Think of it as a professional guard configuration files, and basically set the appropriate values for the Android (referenced by name in the manifest does not obfuscation, such as a class may have ,...), the private developers who, without any modification if the If you must use a configuration file seems to be : "Default.properties" (Project settings file) opens a file using the following procedure would set a guard will just add value.
=> proguard.config=proguard.cfg










3. Build
: The build process automatically "Proguard Tool" two works. Proguard to your project folder is a newly created sub-folders within that folder, the following four files are generated.
- Dump.txt: Your application is being used in the internal structure of the class represents information about the rough. Literally for obfuscation in the process of analyzing the source deompeugapdeulyigetjo out. Well. - Mapping.txt: This file is important. Existing class or method is in the process of obfuscation which has been mapped to the new obfuscated name to the list, marked. Occurs in a log or application obfuscation, better prepared to analyze the stack trace is extremely important. - Seeds.txt: Obfuscation is a list of classes and members are not. - Usage.txt: because they are not used, apk files are removed from the list of codes. Doeseoneun removal method or class you should not have been removed, you will want to check out.






























In addition, inquiries, or questions, please contact us.
(joonryang@gmail.com)

[Android 강좌][Korean][테마] - Android Eclipse "Proguard" 사용




※ Proguard ?
:"코드 난독화" Tool로써, 코드에서 사용된 각종 심볼들의 이름을 기계가 생성한 짤막한 대체 이름을 변경합니다.
 따라서, 공격자는 dontAllow() 라는 메서드가 사용된다는 정보 대신 a() 라는 메서드가 사용된다는 정보만을 얻게 됩니다. 따라서 공격자는 원본 소스코드를 참조하지 않으면 각각의 메서드들이 어떤 일을 수행하는지 직감적으로 알아채기 어렵게 됩니다
: 상용이던 개인용이던 안드로이드는 자바코드를 사용하기 때문에 dex tool과 jad tool등을 이용하면 decompile을 통한 reverse engineering이 가능하다.
이를 해결하기 위해 코드난독화툴을 이용하여 reverse를 어렵게 하는 방법을 사용하게 된다. proguard는 코딩을 어떻게 하느냐에 따라 난독이 아니라, 전혀 해독이 불가하게 할수도 있다는 것이다.

1. ADT 최신 버전 설치
: "Window -> Android SDK and AVD Manager"를 통해서 최신 버전 설치.
: 우선 당연히 현재 사용하고 계신 ADT 를 최신 버전(8.0.1 이 후 버전)을 설치 하셔야합니다. 기존에 설치된 ADT 가 있으시면 최신 버전으로 업데이트 하시면 됩니다. ADT 를 업데이트 하는 것과, 어플리케이션 타겟 플랫폼을 결정하는 것은 별다른 상관이 없으니 호환성에 대하여 큰 걱정 하지 않고 과감하게 업데이트 하셔도 좋습니다.











2. 신규 프로젝트 생성
- "Eclipse"에서 "File > New > Android Project" 를 선택하셔서 새 프로젝트를 만듦
(프로젝트 루트 폴더에 2개의 파일이 생성됨)
: "proguard.cfg"
프로가드 환경 설정 파일이라고 생각하시면 되며, 기본적으로 안드로이드에 알맞은 설정 값(메니페스트에서 이름으로 참조하는 클래스는 난독화 하지 않는 등,...)을 갖고 있음으로, 개인 개발자 분들이라면 별다른 수정 없이 해당 설정 파일을 사용하시면 될 듯 합니다
: "default.properties"
(프로젝트 설정 파일임) 파일을 열어서 아래와 같이 프로가드를 사용하겠다고 설정 값을 추가하시면 됩니다
=> proguard.config=proguard.cfg

3. 빌드
: 빌드과정에서 자동으로 "Proguard Tool"이 동작함.
여러분의 프로젝트 폴더에 proguard 라는 하위 폴더가 새롭게 생성되며 해당 폴더 내에, 다음의 네 가지 파일이 생성됩니다.
- dump.txt : 여러분의 어플리케이션에서 사용중인 클래스들의 내부 구조에 대한 대략적인 정보를 나타냅니다. 말그대로 난독화 하기 위해 소스를 분석하는 과정에서 나오는 덤프값들이겠조. 뭐.
- mapping.txt : 이 파일은 중요합니다. 난독화 과정에서 기존 클래스 혹은 메서드가 어떤 새로운 난독화된 이름으로 매핑되었는지 그 목록을 표시해 줍니다. 난독화 된 어플리케이션에 발생하는 로그나, 스택 트레이스 들을 분석하기 위해서 꼭 챙겨 두셔야 합니다.
- seeds.txt : 난독화 되지 않은 클래스와 멤버들의 목록입니다.
- usage.txt : 사용되지 않기 때문에, apk 파일에서 제거된 코드들의 목록입니다. 혹시 제거되서는 안되는 메서드나 클래스가 제거되었는지 꼭 확인해 봐야 합니다.





추가로 문의 사항이나, 궁금한 점이 계시면 연락주세요.
(joonryang@gmail.com)
※ 도움이 되셨다면, ^^. 맨 위 광고클릭 좀..ㅎㅎ