마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

특정 값 이상이면 글자 색 변경하는 방법 ㅠㅠ

0 추천

아두이노와 연동하여 센서 값을 받아와서 앱 화면에 출력하고 있습니다.

센서 값이 특정 값 이상이라면 글자 색을 변경하고 싶은데요.

처음엔 초록색이다가 특정 값 이상이 되면 빨강색으로 변경하고 싶습니다.

private class ConnectedBluetoothThread extends Thread {
        private final BluetoothSocket mmSocket;
        private final InputStream mmInStream;
        private final OutputStream mmOutStream;

        public ConnectedBluetoothThread(BluetoothSocket socket) {
            mmSocket = socket;
            InputStream tmpIn = null;
            OutputStream tmpOut = null;

            try {
                tmpIn = socket.getInputStream();
                tmpOut = socket.getOutputStream();
            } catch (IOException e) {
                Toast.makeText(getApplicationContext(), "소켓 연결 중 오류가 발생했습니다.", Toast.LENGTH_LONG).show();
            }

            mmInStream = tmpIn;
            mmOutStream = tmpOut;
        }
        public void run() {
            byte[] buffer = new byte[1024];
            int bytes;

            while (true) {
                try {
                    bytes = mmInStream.available();
                    if (bytes != 0) {
                        SystemClock.sleep(100);
                        bytes = mmInStream.available();
                        bytes = mmInStream.read(buffer, 0, bytes);
                        mBluetoothHandler.obtainMessage(BT_MESSAGE_READ, bytes, -1, buffer).sendToTarget();
                    }
                } catch (IOException e) {
                    break;
                }
            }
        }
        public void write(String str) {
            byte[] bytes = str.getBytes();
            try {
                mmOutStream.write(bytes);
            } catch (IOException e) {
                Toast.makeText(getApplicationContext(), "데이터 전송 중 오류가 발생했습니다.", Toast.LENGTH_LONG).show();
            }
        }
        public void cancel() {
            try {
                mmSocket.close();
            } catch (IOException e) {
                Toast.makeText(getApplicationContext(), "소켓 해제 중 오류가 발생했습니다.", Toast.LENGTH_LONG).show();
            }
        }
    }
}

도움 주시면 감사하겠습니다 ㅠㅠㅠㅠ

황제 (230 포인트) 님이 2022년 6월 2일 질문
황제님이 2022년 6월 3일 수정

1개의 답변

+1 추천

올리신 코드가 쓰레드죠. 백그라운드 쓰레드에서는 화면업데이트를 할 수 없습니다. 위 쓰레드 클래스가 액티비티 안에 위치해 있다면  해당 이벤트가 발생할 때runOnUiThread에서 글자 색을 변경하시고, 만약 별도의 클래스라면 Listener 인터페이스를 생성해서 setListener를 통해 리스너인스턴스를 설정할 수 있도록 하시고 해당 이벤트가 발생할 때 리스너의 콜백을 호출하세요. 그리고 이 쓰레드를 사용하는 클래스는 Listener 인터페이스를 구현하도록 하시면 됩니다.

아래처럼요. (코드를 이미지로 올리셔서 다시 타이핑하기가 힘들어서 일부는 생략합니다.)

//올리신 클래스라고 가정. 쓰레드를 바로 확장하는 것보다는 내부에서 생성해서 사용하는 것이 더 유연함.
public class MyTask ... {
    interface Listener {
       void onDataRecieved(String data);
       void onFailure(Exception e);
    }  

    private Listener listener;
    public void setListener(Listener listener) {
       this.listener = listener;
    } 

    // 이벤트 발생시
    if (listener != null) listener.onDataRecieved(...);
}


// 호출하는 쪽. 액티비티로 가정
public class MyActivity implements MyTask.Lstener { //<--- MyTask.Listener 구현
   
     private MyTask myTask;

     public void onCreate(...) {
       super.onCreate(...);
       ...

       
       myTask = new MyTask(); 
        myTask.setListener(this); //<--- this 가 MyTask.Listener인터페이스이므로 
     }

    @Override
    public void onDataRecieved(String data) {
         // TODO :  필요한 처리
    }

    @Override
   public void onFailure(Exception e) {
       // TODO : 에러처리
   }

   @Override
   protected void onStart() {
       super.onStart();
      if (myTask != null) {
          myTask.setLisetner(this);
      }
   }

  @Override
   public void onStop(...) {
     super.onStop();
    if (myTask != null) {
        myTask.setLisetner(null);
    }
  }
}

 이 때, onStart/onStop의 라이프사이클 콜백을 처리해주셔야 화면이 백그라운드로 가더라도 쓸데없는 이벤트를 받지 않을 겁니다. 그리고 액티비티가 종료되는 등의 이벤트에는 쓰레드가 종료되지 않았다면 종료시키는 로직도 추가하는 게 안전하겠죠.

Listener의 메소드 선언은 상황에 맞게 수정하시면 좋을 것 같네요.

spark (226,720 포인트) 님이 2022년 6월 2일 답변
안녕하세요! 친절한 답변 너무 감사합니다 ㅠㅠ 저는 안드로이드스튜디오를 배우지 않은 사람이라 ㅜㅜ 구글링에 의지해서 하려니 너무 어렵네요 ..
제가 올린 코드는 MainActivity.java 에 사용한 코드 입니다.
private class ConnectedBluetoothThread extends Thread {
이 안에 작성한 내용이구요..
말씀해주신 해당 이벤트가 발생할때 라는건 제가 말한 센서 값이 일정 이상이 되었을 때 를 말씀하시는거 맞나요??
그냥 자바로 if 사용해서 변수값>=1500 이런식으로 사용하면 되나요 ㅠㅠ??

너무 아는게 없어서 죄송합니다 ㅠㅠ 정말 친절하게 알려주셨는데 ,,ㅠㅠㅠ
runOnUiThread 사용법
네. 그렇게 하시는게 맞습니다.
...