안드로이드 개발

java.lang.InterruptedException 해결 방법

피커 2023. 3. 15. 17:57
728x90
반응형

스레드는 우리가 의도하지 않아도 자주 사용하게 됩니다.

간혹 InterruptedException를 발생하게 되며, 해결 방법에 대해 공유합니다.

상위 스레드가 갑자기 죽거나 말그대로 스레드에 인터럽트가 걸리는 경우가 발생할때 나온다.

java.lang.InterruptedException

1. 예시 코드

new Thread() {
    @Override
    public void run() {
            int currentposition = 0;
            while (currentposition<mediaPlayer.getDuration()){
                currentposition = mediaPlayer.getCurrentPosition();
                seekBar.setProgress(currentposition);
                try {
                    sleep(800);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }

 

2. 에러 발생

에러 내용
E/AndroidRuntime: FATAL EXCEPTION: Thread-3
    Process: com.picker.songhero, PID: 8890
    java.lang.RuntimeException: java.lang.InterruptedException
        at co m.picker.songhero.Song$2.run(Song.java:90) 
     Caused by: java.lang.InterruptedException
        at java.lang.Thread.sleep(Native Method)
        at java.lang.Thread.sleep(Thread.java:450)
        at java.lang.Thread.sleep(Thread.java:355)
        at co m.picker.songhero.Song$2.run(Song.java:88)

 

3. 해결 방법

  3-1. 첫번째 방법

    -. 아래처럼 단순히 try catch문을 전체적으로 감싸면 Fatal이 발생하지 않고 단순 해결이 됩니다.

updateSeek = new Thread() {
    @Override
    public void run() {
        try {
            int currentposition = 0;
            while (currentposition<mediaPlayer.getDuration()){
                currentposition = mediaPlayer.getCurrentPosition();
                seekBar.setProgress(currentposition);
                sleep(800);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
};

   3-2. 정석적인 방법은 사용하는 코드의 라이브러리의 스레드를 확인하는것이다.

        부모스레드의 인터럽트때문인 경우가 대부분이기 때문에, 본인 코드의 스레드와 라이브러리 스레드의 관계를

        찾아보고 독립적으로 사용하도록 하면된다.

        즉 스레드를 추가적으로 생성하도록 한다.

 

4. 아래는 구글에서 제공하는 관련 정보입니다.

 

InterruptedException

bookmark_border
public class InterruptedException
extends Exception

java.lang.Object
   ↳ java.lang.Throwable
     ↳ java.lang.Exception
       ↳ java.lang.InterruptedException

Thrown when a thread is waiting, sleeping, or otherwise occupied, and the thread is interrupted, either before or during the activity. Occasionally a method may wish to test whether the current thread has been interrupted, and if so, to immediately throw this exception. The following code can be used to achieve this effect:


  if (Thread.interrupted())  // Clears interrupted status!
      throw new InterruptedException();
 
See also:

Object.wait()
Object.wait(long)
Object.wait(long, int)
Thread.sleep(long)
Thread.interrupt()
Thread.interrupted()
Summary
Public constructors
InterruptedException()
Constructs an InterruptedException with no detail message.

InterruptedException(String s)
Constructs an InterruptedException with the specified detail message.

Inherited methods
From class java.lang.Throwable
From class java.lang.Object
Public constructors
InterruptedException
Added in API level 1

public InterruptedException ()
Constructs an InterruptedException with no detail message.

InterruptedException
Added in API level 1

public InterruptedException (String s)
Constructs an InterruptedException with the specified detail message.

Parameters
s String: the detail message.

반응형