(초보)java로 android 코딩중 어플이 프리징걸립니다 (수정2)

조회수 1096회

이런 오류가 뜨는데 일단 코드는 아래과 같습니다. 다른 쓰레드 하나가 더 있는데 그건 다른 기능이라 뺏구요.

1번 쓰레드에서 카운트다운을 runOnUiThread로 보여주고 0초가 되면 알람을 울리게 while문으로 설정했습니다.(반복재생)

그 후 2번 쓰레드에서 버튼 입력을 받아서 10초부터 다시 카운트다운을 센 후 다시 알람이 울리게 만들려고 코드를 짰는데 버튼을 누르면 화면이 멈추고 10초 후에 알람이 다시 울립니다. 하지만 프리징은 그대로 걸려있어서 다른 동작을 할 수가 없습니다. 다른 것들은 작동을 확인했는데 runOnUiThread로 다른 쓰레드에서 textView를 수정하려고 하면 프리징이 걸립니다. 어디서 잘못된걸까요.

수정2

아래 코드 중 buttonSnooze의 for문과 while문이 들어가면 프리징이 걸립니다. 생략된 쓰레드에선 r값을 1로 바꾸면서 알람을 끄는 작동을 합니다. 그래서 생략된 쓰레드 작동시 알람이 꺼져야 하는데 프리징 때문에 아무런 작동을 할 수 없습니다.

for문이 돌아가는동안 프리징이 걸리고 while문이 돌아가는동안 프리징이 걸립니다.

while문은 나오려면 다른 쓰레드에서 r값을 바꿔줘야하는데 프리징으로 다른 버튼을 누를 수가 없어서 무한히 프리징이 걸립니다.

@Override protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_monitor);

    textViewTime= (TextView) findViewById(R.id.textViewTime);
    buttonDismiss= (Button) findViewById(R.id.buttonDismiss);
    buttonSnooze= (Button) findViewById(R.id.buttonSnooze);

    Intent inintent=getIntent();
    RingSet=inintent.getIntExtra("RingId", 0);
    SetTime=inintent.getIntExtra("SetTime", 0);

    textViewTime.setText(String.valueOf(SetTime));
    mediaPlayer=MediaPlayer.create(getApplicationContext(), RingSet);

                new Thread(){
                    public void run(){
                        if(SetTime==0) return;
                        for(i=SetTime; i>0; i--){
                            runOnUiThread(new Runnable(){
                                public void run(){
                                    textViewTime.setText(String.valueOf(i));
                                }
                            });
                            SystemClock.sleep(1000);
                        }
                        runOnUiThread(new Runnable(){
                            public void run(){
                                textViewTime.setText(String.valueOf("0"));
                            }
                        });
                        if(RingSet==0) return;
                        if(r!=1){
                            runOnUiThread(new Runnable(){
                                public void run(){
                                    buttonSnooze.setVisibility(View.VISIBLE);
                                    Toast.makeText(getApplicationContext(), "Alarm is ringing", Toast.LENGTH_SHORT).show();
                                }
                            });
                        }

                        while(r==0){
                            mediaPlayer.start();
                        }
                    }
                }.start();

                new Thread(){
                    public void run(){
                        mediaPlayer=MediaPlayer.create(getApplicationContext(), RingSet);
                        buttonSnooze.setOnClickListener(new View.OnClickListener(){
                                @Override public void onClick(View arg0){
                                    r=2;
                                    mediaPlayer.stop();

                                        for(i=10; i>0; i--){  
                                            runOnUiThread(new Runnable(){
                                                public void run(){
                                                    textViewTime.setText(String.valueOf(i));
                                                }
                                            });
                                            SystemClock.sleep(1000);
                                        }
                                        while(r==2){
                                            mediaPlayer.start();
                                        }

                                }
                            });
                    }
                }.start();  
  • (•́ ✖ •̀)
    알 수 없는 사용자
  • 도움이 될지는 모르겠지만, SystemClock.sleep를 사용하면, interrupt를 할 수 없다고 해요. 자세한 내용은 https://stackoverrun.com/ko/q/3294212 를 참고하시고, 찾아보시는게 좋을 것 같네요. 결과적으론 Thread.sleep()형태로 써야될것 같습니다. 심승현 2018.11.28 20:29
  • 저도 계속 고민하다가 thread.sleep을 써보면 어떨까 하고 바꿔보았는데, 이 문제는 아닌가 봅니다. 도움을 주셔서 감사합니다. 알 수 없는 사용자 2018.11.29 08:30
  • 윗 쓰레드에서 for문과 while문은 정상작동하는데 아래 쓰레드의 버튼리스너 안의 for문과 while문이 작동하는 동안 프리징이 걸립니다. 알 수 없는 사용자 2018.11.29 09:28

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)