Android/Java
[Android/java] 실시간 날짜, 시간정보 받아오기 Handler 사용
colalove5562
2020. 12. 24. 17:12
안드로이드 스튜디오에서 실시간으로 바뀌는 시간 표시하기! 또는 오늘 날짜 표시하기
그냥 시간 가져와서 표시하는 예제는 은근 많아서.. 가장 짧은 코드로(?) 무작정 따라했는데, 큰 문제는 아니지만, 코드창에 경고 문구가 나타났습니다.
에러 : This Handler class should be static or leaks might occur
대충 찾아보니 현재코드를 계속 사용할경우 메모리상에 문제가 생길 수 있다는 내용.당장 앱이 돌아가는데는 문제없지만 찝찝하고..! 또 언젠가는 고쳐야 할것같아서 고치기로!
mainia.tistory.com/1393 : 아주 좋은 예제
public class MainActivity extends AppCompatActivity {
BackgroundThread backgroundThread;
TextView myText;
//private boolean myTextOn = true;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myText = findViewById(R.id.mytext);
}
private final MyHandler mHandler = new MyHandler(this);
private static class MyHandler extends Handler {
private final WeakReference<MainActivity> mActivity;
public MyHandler(MainActivity activity) {
mActivity = new WeakReference<MainActivity>(activity);
}
@Override
public void handleMessage(Message msg){
MainActivity activity = mActivity.get();
if (activity != null){
activity.handleMessage(msg);
}
}
}
public void handleMessage(Message msg) {
myText.setText(DateFormat.getDateTimeInstance().format(new Date()));
// if(myTextOn){
// myTextOn = false;
// myText.setText(DateFormat.getDateTimeInstance().format(new Date()));
// myText.setVisibility(View.GONE);
// } else{
// myTextOn = true;
// myText.setVisibility(View.VISIBLE);
// }
}
@Override
protected void onStart() {
super.onStart();
backgroundThread = new BackgroundThread();
backgroundThread.setRunning(true);
backgroundThread.start();
}
@Override
protected void onStop() {
super.onStop();
boolean retry = true;
backgroundThread.setRunning(false);
while(retry){
try{
backgroundThread.join();
retry = false;
} catch (InterruptedException e){
e.printStackTrace();
}
}
Toast.makeText(this, "onStop()", Toast.LENGTH_SHORT).show();
}
public class BackgroundThread extends Thread{
boolean running = false;
void setRunning(boolean b) {
running = b;
}
@Override
public void run(){
while (running){
try {
sleep(1000);
} catch (InterruptedException e){
e.printStackTrace();
}
mHandler.sendMessage(mHandler.obtainMessage());
}
}
}
}
중간에 주석처리가 있는 이유는 예제와는 달리, 저는 시간을 보여주기 위해 필요없는 부분이라 주석으로 두었습니다.
쓰지 않는 부분은 각자 판단해서 지우거나 추가하여 활용하면 될것 같아요!