네트워크 상태, 센서 값등은 쓰레드를 통해 현재 상태를 받아온다.
중요한 점은 센서값을 받을 때 메인UI에게 그 상황을 알려주어야 한다는 점이다.
이것을 어떻게 구현할까?
이를 위해 C#에는 delegate가 있다면 JAVA에는 interface가 존재한다.
코드를 통해서 확인하자
C# 코드는 현재 상황을 textBox에 보여주는 코드이다.
총 2개의 코드가 있다.
Form : 화면 GUI 출력 코드, textBoxLog에 현재의 로그를 출력한다.
Thread : check()함수를 통해 쓰레드를 실행시키고 쓰레드는 checkMethod 함수를 실행하며 현재의 상황을 측정한다. 그리고 로그를 Form에게 보낸다.
ParentForm.cs (화면에 보여지는 코드) |
public delegate void printLog(String str); public printLog printLogDelegate; public 생성자(){ printLogDelegate = new printLog(printLogMethod); Thread thread = new Thread(this); } public void printLogMethod(String str){ textBoxLog.Text = str; } |
Thread.cs (현재 상황을 측정하는 코드) |
ParentForm form; public Thread(parentForm form){ this.form = form; } private void printLog(String str){ form.Invoke(form.printLogDelegate, new object[] { str }); } public void check(){ checkThread = new Thread(new ThreadStart(checkMethod)); checkThread.Start(); } public checkMethod(){ this.printLog("현재 상태"); }
|
이제 위의 코드를 안드로이드에서 구현해보겠다.
JAVA 코드는 현재 상황을 프로그레스로 보여주는 코드이다.
checkProgress : 액티비티와 서비스(또는 쓰레드) 간에 동기화를 위한 인터페이스
MainActivity : 현재의 상태를 화면에 뿌려주는 액티비티, 버튼을 누르면 핸들러가 실행이 된다.
CheckManager : 쓰레드로 작성함. (서비스도 상관없음). 현재의 상태를 측정한 뒤 액티비티에게 현재 상태를 전송
checkProgress.java |
//이 파일이 꼭 있어야함 public interface CheckProgress { public void progressing(int Progress, String result); } |
MainActivity.java |
private static final int CHECK = 0; Handler handler = new Handler() { public void handleMessage(Message msg) { switch (msg.what) { case CHECK : CheckManager checkManager= new CheckManager( new CheckProgress() { @Override public void progressing(int Progress, String Result){ // TODO Auto-generated method stub //progressCheck라는 프로그레스 바 값을 바꿀 것임 progressCheck.setProgress(Progress); } }); break; } } } public void checkStart() { handler.sendEmptyMessage(CHECK); } |
CheckManager.java |
public class CheckManager extends Thread { private CheckProgress checkProgress; public 생성자(CheckProgress checkProgress){ this.checkProgress = checkProgress; }
public void checkMethod(){ //상태 체크 checkProgress.progressing(40, "현재상태"); }
@Override public void run() { // TODO Auto-generated method stub super.run(); checkMethod(); } } |