본문 바로가기

개발/Android

안드로이드(JAVA)와 C#에서의 쓰레드 화면 동기화

네트워크 상태, 센서 값등은 쓰레드를 통해 현재 상태를 받아온다.


중요한 점은 센서값을 받을 때 메인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();

     }

 }