Skip to content

Commit

Permalink
Update 0320.md
Browse files Browse the repository at this point in the history
add additional contents
  • Loading branch information
magiccaller authored Mar 20, 2017
1 parent 79d90c0 commit 60ef70e
Showing 1 changed file with 219 additions and 0 deletions.
219 changes: 219 additions & 0 deletions Programming/basicStudy/0320.md
Original file line number Diff line number Diff line change
Expand Up @@ -409,3 +409,222 @@ public class MainActivity extends AppCompatActivity {
}

```



# 03_20(2)

## Reactive eXtension programming

- 데이터 단위 비동기 처리
- 비동기 처리 과정에서 효율적이고 고성능으로 지원


- 안드로이드에서 활용
- 파일 복사
- 이미지 프로세싱
- 네트워크 통신
- 로컬 데이터베이스처리

- 비동기 처리가 필요한 모든 동작



- 들어오는 데이터 흐름을 확인 가능할 때 - Observable
(Array, List..)
컨테이너 안의 데이터들이 for문으로 도는 거라고 생각
하나 처리하고, 하나 부르고...

- 데이터가 무작위적인 흐름으로 들어올 때 - Subject
(Click, touch, TextChange...)
순서를 정해준 후 처리




- Rx java는 Lambda Expression를 알아두는 게 거의 필수




- RetroLambda라는 툴이 자바 6에서도 자바8 람다식을 쓸 수 있게 해주는 툴



- 레트로 람다 설정

- RetroLambda
- 2번 컴파일

- gradle 추가

```
classpath 'me.tatarka:gradle-retrolambda:3.4.0'
```

```
apply plugin: 'me.tatarka.retrolambda'
```


### for문 -> Rx 람다식으로 변환

```java

package com.nobrain.rx_study.step1;

import android.text.TextUtils;

import org.junit.Test;

import java.util.Arrays;
import java.util.List;

import io.reactivex.Observable;
import io.reactivex.Observer;
import io.reactivex.annotations.NonNull;
import io.reactivex.disposables.Disposable;
import io.reactivex.functions.Consumer;
import io.reactivex.functions.Function;
import io.reactivex.functions.Predicate;

import static org.junit.Assert.*;

/**
* Example local unit test, which will execute on the development machine (host).
*
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
*/
public class ExampleUnitTest {
@Test
public void addition_isCorrect() throws Exception {
List<String> list = Arrays.asList("A", "B", "C", "D");
StringBuilder builder = new StringBuilder();
for(String s : list) {
if(s.charAt(0)%2 ==0) {
continue;
}

String str = s.toLowerCase();
if(str =="a") {
builder.append(str);
}

builder.append(s.toLowerCase());
}
System.out.println(builder.toString());
}

@Test
public void test() throws Exception {
List<String> list = Arrays.asList("A", "B", "C", "D");
final StringBuilder builder = new StringBuilder();
//실제로 동작시키는 method = subscribe()
//<데이터 입력 형태, 데이터 처리 후 형태>
builder.setLength(0);
Observable.fromIterable(list)
.filter(s -> s.charAt(0)%2 != 0)
.map(String::toLowerCase)
.filter(s -> TextUtils.equals(s, "a"))
.subscribe(builder::append,
Throwable :: printStackTrace,
()-> System.out.println(builder.toString()));
}

@Test
public void test1() throws Exception {
List<String> list = Arrays.asList("A", "B", "C", "D");
final StringBuilder builder = new StringBuilder();
//실제로 동작시키는 method = subscribe()
//<데이터 입력 형태, 데이터 처리 후 형태>
builder.setLength(0);
Observable.fromIterable(list)
.map(String::toLowerCase)
.doOnNext(s -> System.out.print(s))
.collect(()-> builder, (stringBuilder, s) -> stringBuilder.append(s))
.map(stringBuilder -> stringBuilder.toString().toUpperCase())
.subscribe(string -> System.out.println(string));
}
}

```


### Subject 사용

```java

@Test
public void test2() throws Exception {
List<String> list = Arrays.asList("A", "B", "C", "D");
final StringBuilder builder = new StringBuilder();

PublishSubject<String> subject = PublishSubject.create();
//BehaviorSubject - 기본값 저장가능 subject
//.createDefault();로 생성

subject
.map(String::toLowerCase)
.subscribe(string -> System.out.println(string));

subject.onNext("A");
subject.onNext("B");
subject.onNext("C");
subject.onNext("D");

subject.onComplete();//subject를 사용할 때는 자동호출되지 않아서 선언해줘야 한다
}


```

```java

List<Integer> datas = Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14);
Observable.fromIterable(datas)
.observeOn(Schedulers.computation())
//computation, io 쓰레드풀 이 2개만 알면된다
//computation 그냥 연산
//io
.map(data -> {
Thread.sleep(1000);
if(data %2 ==1) {
return ' ';
}
return ((char) ('a' + data));
})
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io()) //observeOn 동작 사이에 동작한다
.subscribe(character -> tv.setText(tv.getText().toString() + character));

```


### 네트워크

- Retrofit
- Rxjava Converter

- gradle

```java

compile 'com.squareup.retrofit2:retrofit:2.1.0'
compile 'com.squareup.retrofit2:converter-gson:2.1.0'
compile 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0'

```

- 데이터 처리 strategy

Observable - > Flowable
Subject - > Processor



## Observable -> subject -> 혼용 해보기


# [참고 SRC](https://github.com/RohHyungmin/Rx_android_Study)

0 comments on commit 60ef70e

Please sign in to comment.