반응형
안드로이드(Android) 백그라운드 스레드 소스 Runnable 이용해 구현 |
환경 : Eclipse Mars, Android 4.2.2 |
이번예제는 “안드로이드(Android) 백그라운드에서 Handler 를 통해 UI 변경” 아티클에서 만든 내용을 조금 수정할려고 합니다. Thread 클래스 대신 Runnable 인터페이스 클래스를 사용해서 변경하려 합니다.
▼ 기존에 Thread 클래스를 상속받아 사용자 정의 클래스를 만들었다면 이번에는 Thread 객체를 그대로 쓰고 생성자 함수에 Runnable 클래스를 넘겨서 구현하였습니다. 결과는 동일합니다. Thread 를 이렇게도 구현을 하는구나 하는 것을 보여주기 위함입니다. 기존 소스를 Runnable 상속받는 것으로 수정합니다.
public class BackgroundThread implements Runnable { public void run() { while (running) { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } mHandler.sendMessage(mHandler.obtainMessage()); } } }
▼ 그리고 스레드 객체를 만드는 소스는 다음과 같이 수정됩니다. 생성자 인수로 Runnable 객체를 넘기게 되는 것이죠. While 문을 계속 돌릴것인지를 판단하는 running 값을 셋팅하는 부분은 메인 activity 로 빼놨습니다.
private Thread backgroundThread; backgroundThread = new Thread(new BackgroundThread());
▼ 아래는 스레드 부분을 Runnable 로 수정한 전체 소스 내용입니다. 입맛에 맞는 걸로 사용하시기 바랍니다.
import java.lang.ref.WeakReference; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.view.View; import android.widget.TextView; import android.widget.Toast; public class BackgroundThreadActivity extends Activity { private TextView myText; private boolean myTextOn = true; private final MyHandler mHandler = new MyHandler(this); private Thread backgroundThread; private boolean running = false; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_background_thread); myText = (TextView) findViewById(R.id.mytext); Toast.makeText(this, "onCreate()", Toast.LENGTH_LONG).show(); } void setRunning(boolean b) { running = b; } // Handler 에서 호출하는 함수 private void handleMessage(Message msg) { if (myTextOn) { myTextOn = false; myText.setVisibility(View.GONE); } else { myTextOn = true; myText.setVisibility(View.VISIBLE); } } @Override protected void onStart() { super.onStart(); backgroundThread = new Thread(new BackgroundThread()); setRunning(true); backgroundThread.start(); Toast.makeText(this, "onStart()", Toast.LENGTH_LONG).show(); } @Override protected void onStop() { super.onStop(); boolean retry = true; setRunning(false); while (retry) { try { backgroundThread.join(); retry = false; } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } Toast.makeText(this, "onStop()", Toast.LENGTH_LONG).show(); } public class BackgroundThread implements Runnable { public void run() { while (running) { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } mHandler.sendMessage(mHandler.obtainMessage()); } } } // 핸들러 객체 만들기 private static class MyHandler extends Handler { private final WeakReference<BackgroundThreadActivity> mActivity; public MyHandler(BackgroundThreadActivity activity) { mActivity = new WeakReference<BackgroundThreadActivity>(activity); } @Override public void handleMessage(Message msg) { BackgroundThreadActivity activity = mActivity.get(); if (activity != null) { activity.handleMessage(msg); } } } }
반응형
'안드로이드 개발' 카테고리의 다른 글
안드로이드(Android) Chronometer 사용하여 시간측정을 위한 타이머 만들기 (1) | 2015.01.05 |
---|---|
안드로이드(Android) Chronometer, OnChronometerTickListener 통해 시간알아오기 (2) | 2015.01.04 |
안드로이드(Android) 웹페이지에서 이미지 다운로드 구현 (0) | 2015.01.01 |
안드로이드(Android) ListActivity 를 이용해여 간단한 목록형 화면만들기 (0) | 2014.12.28 |
안드로이드(Android) 백그라운드에서 Handler 를 통해 UI 변경 (1) | 2014.12.23 |
안드로이드(Android) This Handler class should be static or leaks might occur 해결 (6) | 2014.12.21 |
안드로이드(Android) Android.graphics.Color 에서 제공하는 컬러보기 샘플구현 (0) | 2014.12.17 |
안드로이드(Android) Activity 의 라이프사이클(LifeCycle) 알아보기위한 예제 (0) | 2014.12.16 |