스레드는 우리가 의도하지 않아도 자주 사용하게 됩니다.
간혹 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.
'안드로이드 개발' 카테고리의 다른 글
The Google Mobile Ads SDK was initialized incorrectly 해결법 (0) | 2023.03.16 |
---|---|
Could not resolve com.android.tools.build:gralde 에러 해결 법 (1) | 2023.03.15 |
Cannot resolve symbol 에러 해결 방법 (0) | 2023.03.09 |
안드로이드 스튜디오 Gradle build failed (0) | 2023.02.26 |
java.lang.NoSuchMethodError: No static method metafactory 에러 간단 해결 방법 (0) | 2023.01.19 |