BLO9
Kotlin 등 개발 관련 포스팅합니다.
Android thread samples

JDK8 or Lambda, Stream 을 지원하지 않는 안드로이드에서 Retrolambda, RxJava, Kotlin, Scala 등은 필수가 되어버린 느낌이다. 이것들은 비동기처리나 REST, 레이아웃처리를 쉽게 바꿔주고 RecyclerView 를 이용한 리스트를 쉽게 만들 수 있게 도와준다. 하지만 background에서 list를 함부로 접근한다면 에러를 면할 수 없을 것이다.

Q) Thread or Background 에서 0부터 100까지 1씩 증가하는 ${number}를 TextView.setText(${number})

java.lang.Thread

  • 코드
  • Runnable runnable = new Runnable() {
        @Override
        public void run() {
            for (int i = 0; i < 100; i++) {
                textView.setText(String.format("%d", i));
                sleep();
            }
        }
    };
    
    Thread th = new Thread(runnable);
    th.start();
  • 특징

    특정 버전이나 기기에서는 작동하지 않는다. 작동하더라도 0부터 100까지에 중간과정을 보기 어렵다.

uiThread

  • 코드
  • Runnable runnable = () -> {
        for (int i = 0 ; i < 100 ; i++) {
            textView.setText(String.format("%d", i));
            sleep();
        }
    };
    
    runOnUiThread(runnable);
  • 특징

    기억안남

AsyncTask

  • 코드
  • AsyncTask<Integer, Void, Void> async = new AsyncTask<Integer, Void, Void>() {
        @Override
        protected Void doInBackground(Integer...params) {
            for (int i = 0 ; i < params[0] ; i++) {
                runOnUiThread(()->{
                    textView.setText(String.format("%d", i));
                });
            }
            return null;
        }
    };
    
    async.execute(100);
  • 특징

    기가 맥히게 빠르다. rx와 비교시, 근데 먼가 드럽다.

RxJava/RxAndroid

  • 코드
  • Observable.range(0, 100)
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(new Observer<Integer>() {
            @Override
            public void onCompleted() {
        
            }
            @Override
            public void onError(Throwable e) {
                e.printStackTrace();
            }
            @Override
            public void onNext(Integer integer) {
                textView.setText(String.format("%d", integer));
            }
        });
  • 특징
  • 주석처럼 여러 함수를 제공해준다. 또한 `REST` 라이브러리에서 어뎁터를 많이 지원해준다. 대세라 그런지 많은 라이브러리에서 사용하며, 확장라이브러리들도 많다.

A) 결론

무조건 Rx를 쓰도록 하자! 그리고 Rx에서 지원해주는 처리함수들이 많아 이득을 많이 볼 수 있다.