Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
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
Archives
Today
Total
관리 메뉴

집요정 도비의 일기

Step 3. 음악 스트리밍 서버(Spring boot), 앱(Android)을 만들어보자. 본문

개발 일기

Step 3. 음악 스트리밍 서버(Spring boot), 앱(Android)을 만들어보자.

집요정_도비 2016. 3. 5. 14:13

11. 목적

-클라이언트에서 서버 디렉토리의 하위 디렉토리로 자유롭게 이동이 가능하게 만든다.


12. 안드로이드 구현

-서버는 저번 포스트에서 이미 여기까지 구현이 되어 있다. 더 이상 건드릴 필요가 없음.

-사실 저번 포스트에 거즘 구현이 마쳐져 있다. 이제 안드로이드의 RecyclerView에서 각 요소를 클릭했을 때의 클릭이벤트를 구현만 하만 하면 된다.


*클릭 이벤트 구현 (Steps)

(1) MainListAdapter.java에 클릭 처리용 이너 클래스인 인터페이스를 하나 만든다.

(2) MainListAdapter 클래스가 이 인터페이스형의 객체(굳이 말하면 이 인터페이스를 상속 받은 클래스의 인스턴스)를 필드로 갖고, 이를 생성자에서 받아오도록 한다.

(3) MainActivity.java에 위의 인터페이스를 상속 받는 이너 클래스를 생성하여 클릭 이벤트를 처리하게 한다. 

(4) MainListAdapter의 이너 클래스인 MainListViewHolder가 위의 인터페이스형의 객체를 사용하여 OnClickListener를 구현한다.


순서대로 구현함.


(1) MainListAdapter.java에 클릭 처리용 이너 클래스인 인터페이스를 하나 만든다.

* MainListAdapter.java

public interface MainItemClickListener{
public void onClick(FileItem item, int position);
}


(2)  MainListAdapter 클래스가 이 인터페이스형의 객체(굳이 말하면 이 인터페이스를 상속 받은 클래스의 인스턴스)를 필드로 갖고, 이를 생성자에서 받아오도록 한다.

* MainListAdapter.java

public class MainListAdapter extends RecyclerView.Adapter<MainListAdapter.MainListViewHolder>{

private List<FileItem> data = Collections.emptyList();
private Context context;
private MainItemClickListener listener;

public MainListAdapter(List<FileItem> data, Context context, MainItemClickListener listener) {
this.data = data;
this.context = context;
this.listener = listener;
} ........

- MainListAdapter에 필드 listener 하나를 추가하고, 이에 맞춰서 생성자를 변경했을 뿐, 다른 부분은 변경 없음.


(3) MainActivity.java에 위의 인터페이스를 상속 받는 이너 클래스를 생성하여 클릭 이벤트를 처리하게 한다. 


*MainActivity.java

private class MainListListener implements MainListAdapter.MainItemClickListener {

@Override
public void onClick(FileItem item, int position) {

if (item.isGoBack) {
//pressed go back button...
Log.e("MAIN_CLICK", "GO BACK");
int index = StaticVals.MovedDirectory.size() - 1;
StaticVals.MovedDirectory.remove(index);
doMoveDirectory();
} else {
if (!item.isFile) {
//If the selection is a directory, move.
Log.e("MAIN_CLICK", "DIRECTORY");
StaticVals.MovedDirectory.add(item.fileName);
doMoveDirectory();
} else {
//if it's a file, play it.
}
}
}
}


-작동 원리는 단순하다. 리스트뷰의 아이템에 클릭이 들어가면,

(ㄱ) 뒤로 가기 버튼인지 판별한다. 뒤로 가기면 List<String> MovedDirectory의 마지막 인덱스를 제거하고 doMoveDirectory(추후 설명)를 실행

(ㄴ) 뒤로 가기 버튼이 아니면 파일인지 디렉토리인지 판별한다.

(ㄷ) 디렉토리이면,   List<String> MovedDirectory에 클릭된 아이템의 이름(파일, 디렉토리명)을 더하고, doMoveDirectory를 실행.

(ㄹ) 파일(음악 .mp3)파일일 경우의 구현은 다음 포스트에서 다룸.


-실질적으로 request를 하기 위한 doMoveDirectory 메소드를 추가한다.


*MainActivity.java

private void doMoveDirectory(){
HttpSender sender = new GetListSender(new ResultHandler(mainContext));
String requestDirName = "";
for(String dir : StaticVals.MovedDirectory){
requestDirName+=dir+"\\";
}
if(!requestDirName.equals(""))
sender.setBodyContents(requestDirName);
else
sender.setBodyContents();

Log.e("REQDIRNAME", requestDirName);
sender.send();
}


-doMoveDirectory()는 다음과 같이 실행된다.

(ㄱ) GetListSender()객체 생성

(ㄴ) List<String> MovedDirectory의 각 요소들을 \를 하나씩 넣어서 더한다.

만약 MovedDirectory에 들어있는 요소들이 다음과 같다면..

{ Music1, Jason Mraz }

"Music1\\Jason Mraz\\" 라는 스트링이 완성될 것이다.

(ㄷ) requestDirName이 만약 ""그대로(=MovedDirectory의 사이즈가 0)인 경우, 최상위 디렉토리임을 나타내므로, GetListSender.setBodyContents()의 파라미터를 공란으로 처리한다.

(ㄹ) 그렇지 않을 경우, requestDirName을 써서 GetListSender.setBodyContents()를 실행한다.

(ㅁ) HttpSender.send()로 request를 보낸다. 

(ㅂ) Response값을 처리하는 ResultHandler는 최상위 디렉토리에 대한 요청이든 하위 디렉토리에 대한 요청이든 같은 일을 수행하므로, 수정할 필요가 없다.


-그리고, 바로 위의 순서에서 MainListAdapter의 생성자가 변경되었으므로, 그에 맞게 MainActivity의 initMainUI를 수정해준다.

* MainActivity.java

//Setup The RecyclerView with Actual data from the server.
public void initMainUI(List<FileItem> data) {
RecyclerView.Adapter adapter = new MainListAdapter(data, mainContext, new MainListListener());
listView.setAdapter(adapter);
}

 

(4) MainListAdapter의 이너 클래스인 MainListViewHolder가 위의 인터페이스형의 객체를 사용하여 OnClickListener를 구현한다.

* MainListAdapter.java

public class MainListViewHolder extends RecyclerView.ViewHolder{

TextView tv_fileName;
ImageView iv_fileType;
public MainListViewHolder(View itemView) {
super(itemView);
tv_fileName = (TextView) itemView.findViewById(R.id.tv_fileName);
iv_fileType = (ImageView) itemView.findViewById(R.id.iv_fileType);

tv_fileName.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
listener.onClick(data.get(getAdapterPosition()), getAdapterPosition());
}
});//end of ClickListener.
}

- 붉은색 부분만 추가하면 된다. 이렇게 하면 (3)에서 구현한 MainListListener를 호출할 것이다.

- getAdapterPosition() 메소드는 이 클래스의 슈퍼 클래스인 Adapter 클래스가 갖는 매소드로 클릭된 어댑터의 위치를 리턴해준다.


구현 끝


13. 테스트

- 이번 포스트에서는 서버의 하위 디렉토리로의 자유로운 이동을 구현하였다.

- 테스트 시, 아래와 같은 결과를 얻을 수 있었다.


- 저번 테스트에서는 확인 할 수 없었던 Go Back 버튼도 잘 생성됨을 알수 있었고, 클릭 시 상위 디렉토리로 돌아감을 알 수 있었다.

- 하위 디렉토리의 하위 디렉토리까지의 리스트도 재대로 보여줌을 확인하였다.


14. To Do..

- 음악 파일을 클릭 시 스트리밍을 가능하게 한다.






  


Comments