ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 안드로이드 thread와 handler
    Android/AndroidStudio 2018. 7. 7. 00:05

    본페이지는 edwith 사이트의 "android developer" 부스트 코스의 5강.네트워크를 참고 하여 작성하였습니다.



    THREAD

     하나의 Progress안에서 여러 일을 수행하려고 할때 Thread를 사용합니다. 예를 들어, 게임속 여러 몬스터들이 생성되는 것은 사용자가 움직이는 Thread와는 다른 Thread에서 진행되는 것입니다. 안드로이드에서 여러 Thread가 존재합니다. 네트워크로 데이터를 받아오는 경우는 많은 일들이 일어나기 때문에 별로의 Thread를 만들어 데이터를 받아와 화면에 보여주게 됩니다. 특히 안드로이드에서는 앱이 실행되면 메인 쓰레드가 실행이 되고 그안에서 다른 일들을 처리하는 개별 Thread들이 생성됩니다. 이때 여러 Thread들이 같은 리소스에 접근하게 될 수 있는데, 문제가 생기게 됩니다.(표준자바에서는 알아서 처리해준다고 합니다.) 별도의 Thread에서 네트워크를 통해 사진을 받아와 MainThread의 ImageView에 보여주고 싶다면, 네트워크 Thread에서 ImageView에 바로 접근 한 수 없습니다.(안드로이드 ui는 mainThread와 관련있습니다. 이때 필요한 거이 handler입니다



    HANDLER

     위의 상황에서 개별 Thread에서 Handler에 Message 객체를 보내면 Handler는 이를 받아 Main에서 처리합니다.(Handler는 메인에 붙어있습니다). 여러 Thread에서 Message를 보내오면 HandleMessage가 호출되어 전달된 메세지를 큐에서 관리합니다. 메세지를 받아 UI에 접근할 수 있습니다.

     다른 Thread에서는 Handler 객체에서 메세지를 얻어 메세지에 번들 객체를 넣습니다. 

    Bundle 객체를 생성하고 putData()로 데이터를 넣습니다. Handler 객체에서 obtainMessage()로 Message 객체를 받아와 setData()메소드로 메세지에 bundle을 담습니다. sendMessage로 handler에 message객체를 보냅니다.

     

     data(int, string) -> bundle -> message -> sendMessage()



    ValueHandler hander = new ValueHandler();
    TextView textView;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    textView = (TextView)findViewById(R.id.textView);
    Button button = (Button) findViewById(R.id.button2);
    button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
    BackgroundThread thread = new BackgroundThread();
    thread.start();
    }
    });
    }

    class BackgroundThread extends Thread{
    int value =0;

    @Override
    public void run() {
    value++;
    Message msg = hander.obtainMessage();
    Bundle bundle = new Bundle();
    bundle.putInt("value", value);
    msg.setData(bundle);
    hander.sendMessage(msg);
    }
    }

    class ValueHandler extends Handler{
    @Override
    public void handleMessage(Message msg) {
    super.handleMessage(msg);

    Bundle bundle = msg.getData();
    int value = bundle.getInt("value")
    textView.setText(value);

    }
    }


     

    HANDLER와 THREAD를 쉽게 사용하는 방법

     굳이 Handler와 Thread의 클래스를 정의 할 필요없이 정의된 Handler와 Thread를 사용합니다.( 자신의 원하는 작업이 있다면 위의 방법으로 커스텀하면 됩니다.). Thread에 Runnable() 객체를 생성하여 전달합니다. Runnable 객체 안에 run()메소드를 작성합니다(Thread 클래스를 생성한 것과 같은 방법입니다). handler에 값이 담긴 message를 보낼필요 없이 post()메세지로 Runnable 객체를 보내면 Runnable 안의 메소드들은 메인Thread에서 실행되게 됩니다. 때문에 바로 View에 접근할 수 있습니다.


    new Thread(new Runnable() {
    int value = 0;
    boolean running = false;
    public void run() {

    running = true;
    while (running) {
    value += 1;

    handler2.post(new Runnable() {
    public void run() {
    textView.setText("현재값 :" + value);
    }
    });
    try {
    Thread.sleep(1000);
    } catch (Exception e) {
    }

    }
    }
    }).start(); // 생성한 Thread객체를 꼭 실행 시켜야 합니다.





    'Android > AndroidStudio' 카테고리의 다른 글

    커스텀 리스트뷰  (0) 2018.11.07
    MVP MVVM 모델을 활용한 안드로이드 설계  (0) 2018.10.08
    Android Guideline  (0) 2018.07.02
    Thread  (0) 2018.07.01
    Guide to background processing  (0) 2018.06.30
Designed by Tistory.