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   :  아주 좋은 예제

 

안드로이드(Android) This Handler class should be static or leaks might occur 해결

안드로이드(Android) This Handler class should be static or leaks might occur 해결 환경 : Eclipse Mars, Android 4.2.2 안드로이드에서 Handler 오브젝트는 모든 스레드 반복문에서 참조하는데 어느 한곳에..

mainia.tistory.com

 

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());
            }
        }
    }
}

중간에 주석처리가 있는 이유는 예제와는 달리, 저는 시간을 보여주기 위해 필요없는 부분이라 주석으로 두었습니다.

쓰지 않는 부분은 각자 판단해서 지우거나 추가하여 활용하면 될것 같아요!