본문

[2017.11.02] 67. Android 음악 플레이어 프로젝트 [Seekbar Thread 추가]

도입

이번 포스팅에서는 Seekbar Thread를 추가해 현재 음악 진행 상황을 Seekbar로 보여주는 기능을 추가할 예정이다.


Android 음악 플레이어 프로젝트 [Seekbar Thread 추가]의 데이터 흐름

PlayerController 안에 Seekbar Thread를 생성해 음악 플레이어의 현재 상태를 1초 간격으로 알려준다. 그래서 현재 진행 사항을 PlayMainViewActivity와 Notification에 반영한다.

(옵저버 패턴 - http://heepie.tistory.com/137)


문제점 및 해결

1) Seekbar Thread에서 Notification 접근 문제

기존 설계에서는 Seekbar Thread에서 Notification에 직접 접근하도록 설계되어 있었다.(가능한 줄 알았다.)

그러나 Notification의 경우 안드로이드의 4대 컴포넌트가 아니기 때문에 intent로 값을 넘길 수도 없고 Seekbar Thread에서 Notification에 접근할 수 있는 방법이 없다.

그래서 데이터를 Seekbar Thread -> Service -> Notification으로 전달하는 방법으로 변경하였다.

 

2) Seekbar Thread와 PlayerController와의 관계

기존 설계에서는 Seekbar Thread가 독립적으로 존재했다. 그러나 생각해본 결과 Seekbar Thread의 기능은 음악의 현재 상태를 1초간격으로 보내주는 역할을 한다. 그렇다면 Seekbar Thread는 Player에 종속되는 것이 맞다고 생각해 설계를 변경했다. 

변경 전

변경 후

 

 


코드

변경 전

변경 후

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
public class PlayerController {
    private String CLASSNAME 
                = getClass().getSimpleName() + " ";
    private static PlayerController instance;
    private MediaPlayer player;
    private boolean isLoop = false;
 
    private Context context;
 
    private PlayerController() {}
 
    public static PlayerController getInstance() {
        if (instance == null)
            instance = new PlayerController();
        return instance;
    }
 
    public void initPlayer(Context context) {
        this.context = context;
 
    }
 
    public void setMusic(Uri musicUri) {
        releasePlayer();
        player 
            = MediaPlayer.create(context, musicUri);
        player.setLooping(isLoop);
        player.start();
    }
 
    public void play() {
        player.start();
    }
 
    public void pause() {
        if (player != null)
            player.pause();
 
    }
 
    public void next() {
        currentStatus = Const.ACTION_MUSIC_NEXT;
    }
 
    public void prev() {
        currentStatus = Const.ACTION_MUSIC_PREV;
    }
 
    private void releasePlayer() {
        if (player != null) {
            player.release();
            player = null;
        }
    }
}
 
public class SeekbarThread extends Thread {
    static List<IObserver> observers;
 
    SeekbarThread() {
        observers = new ArrayList<>();
    }
 
    public static void registerObserver(IObserver o) {
        observers.add(o);
    }
 
    public void removeObserver (IObserver o) {
        observers.remove(o);
    }
 
    public void run() {
        while(true) {
            for (IObserver o : observers)
                o.setCurrentProgress();
 
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
 
    public interface IObserver {
        void setCurrentProgress();
    }
}
cs

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
public class PlayerController {
    private String CLASSNAME 
            = getClass().getSimpleName() + " ";
    private static PlayerController instance;
    private MediaPlayer player;
    private boolean isLoop = false;
 
    private SeekbarThread seekbarThread;
 
    private Context context;
    private String currentStatus;
 
    private PlayerController() {
        seekbarThread = new SeekbarThread();
    }
 
    public SeekbarThread getSeekbarThread() {
        return seekbarThread;
    }
 
    public static PlayerController getInstance() {
        if (instance == null)
            instance = new PlayerController();
        return instance;
    }
 
    public void initPlayer(Context context) {
        this.context = context;
 
    }
 
    public void setMusic(Uri musicUri) {
        currentStatus = Const.ACTION_MUSIC_SET;
        releasePlayer();
        player 
            = MediaPlayer.create(context, musicUri);
        player.setLooping(isLoop);
 
        play();
    }
 
    public void play() {
        if (!seekbarThread.isAlive())
            seekbarThread.start();
        player.start();
        currentStatus = Const.ACTION_MUSIC_PLAY;
    }
 
    public void pause() {
        if (player != null) {
            player.pause();
            currentStatus = Const.ACTION_MUSIC_PAUSE;
        }
    }
 
    public void next() {
        currentStatus = Const.ACTION_MUSIC_NEXT;
    }
 
    public void prev() {
        currentStatus = Const.ACTION_MUSIC_PREV;
    }
 
    private void releasePlayer() {
        if (player != null) {
            player.release();
            player = null;
        }
    }
 
    public int getCurrentProgress() {
        if (player != null) {
            return player.getCurrentPosition();
        } else
            return 0;
    }
 
    public class SeekbarThread extends Thread {
        private SeekbarThread instance = null;
        SeekbarThread(){
            observers = new ArrayList<>();
        }
 
        List<IObserver> observers;
 
 
        public void registerObserver(IObserver o) {
            observers.add(o);
        }
 
        public void removeObserver (IObserver o) {
            observers.remove(o);
        }
 
        public void run() {
            while(true) {
                for (IObserver o : observers)
                    o.setCurrentProgress
                            (currentStatus);
 
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
 
    }
 
    public interface IObserver {
        void setCurrentProgress(String currentStatus);
    }
}
cs


스크린 샷

 

 

#안드로이드 음악 플레이어 #안드로이드 mp3 #안드로이드 프로젝트  #앱개발 #모바일앱개발 #어플개발

공유

댓글