마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

음원 파일 딜레이 재생을 하고싶습니다

0 추천

///////리스트 뷰 클릭시
public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3){

File fp = new File(STRSAVEPATH);

//해당 경로를 설정 후 저장된 파일 배열로 불러오기
File[] listFiles = fp.listFiles();

File REC_fp = new File(STRSAVEPATH+SAVEFILEPATH[position]);

play_ = readFile(REC_fp);

System.out.println(position);
System.out.println(listFiles.length);
System.out.println(play_.length);

for(a_ = 0; a_<=play_.length; a_+=9){

/////시간 정보
for(int b_ = 0; b_<8; b_++) Time[b_] = play_[a_+b_];

if(a_ == 0){
mSoundManager.playSound(SOUNDIDS[(int)play_[a_+8] - 63]);
}else{
try{
mThread = new Thread(new MyRunnable());
mThread.start();

}catch(Exception e){

}
}

for(int c_ =0 ; c_<8; c_++)
pre_Time[c_] = Time[c_];
}
}

class MyRunnable implements Runnable { 

        @Override 
        public void run() { 
        mHandler.postDelayed(new Runnable() {  
@Override
public void run() {
mSoundManager.playSound(SOUNDIDS[(int)play_[a_+8] - 63]);
}              
}, bytesToLong(Time) - bytesToLong(pre_Time));
        }

}

 

 

제가 버튼 클릭시 시간 정보와 버튼 정보를 저장해서 파일에 저장한 후 리스트 뷰에 파일목록을 뿌려 터치시 해당 저장 정보를 읽어와 재생을 하고싶습니다.  그런데 계속 딜레이까진 되는데 딜레이 후 mSoundManager.playSound(SOUNDIDS[(int)play_[a_+8] - 63]); 여기서 죽네요ㅠㅠ 초보라 로그켓을 봤는데 핸들어 문제라는데 정확하게 잘 모르겠습니다 ㅠㅠ

 

도와주세요 로그캣 에러입니다

 

04-03 10:47:23.225: E/AndroidRuntime(9248): FATAL EXCEPTION: main
04-03 10:47:23.225: E/AndroidRuntime(9248): Process: com.example.portablemusicstudio, PID: 9248
04-03 10:47:23.225: E/AndroidRuntime(9248): java.lang.ArrayIndexOutOfBoundsException: length=36; index=44
04-03 10:47:23.225: E/AndroidRuntime(9248): at com.example.portablemusicstudio.FileListActivity$MyRunnable$1.run(FileListActivity.java:180)
04-03 10:47:23.225: E/AndroidRuntime(9248): at android.os.Handler.handleCallback(Handler.java:739)
04-03 10:47:23.225: E/AndroidRuntime(9248): at android.os.Handler.dispatchMessage(Handler.java:95)
04-03 10:47:23.225: E/AndroidRuntime(9248): at android.os.Looper.loop(Looper.java:145)
04-03 10:47:23.225: E/AndroidRuntime(9248): at android.app.ActivityThread.main(ActivityThread.java:5834)
04-03 10:47:23.225: E/AndroidRuntime(9248): at java.lang.reflect.Method.invoke(Native Method)
04-03 10:47:23.225: E/AndroidRuntime(9248): at java.lang.reflect.Method.invoke(Method.java:372)
04-03 10:47:23.225: E/AndroidRuntime(9248): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1388)
04-03 10:47:23.225: E/AndroidRuntime(9248): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1183)
 

 

CSP_lab (390 포인트) 님이 2015년 4월 3일 질문
필요하시면 전체 소스 올리겠습니다. 자바소스 들여쓰기는 죄송합니다 하고 올리는데 질문 버튼 누르면 왼쪽으로 다 붙어버리네요ㅠㅠ

2개의 답변

0 추천
 
채택된 답변
play_[a+8] 여기서 ArrayIndexOutOfBounds 가 납니다.

a+8이 play_ 배열 길이를 넘어섰다는 거겠죠.

a+8 로 배열 접근하기 전에 체크를 하시든지 로직을 다시 확인해보세요.

 

그리고 멤버 변수끝에 _ 붙이니까 가독성이 매우 떨어지네요..
mamondebaltob (32,750 포인트) 님이 2015년 4월 3일 답변
CSP_lab님이 2015년 4월 3일 채택됨
감사합니다 체크 한번 해보겠습니다
확인을 해봤는데 a+8이 배열 길이를 넘진 않는데 왜 저렇게 될까요?

04-03 11:46:41.837: W/System.err(16255): java.lang.ArrayIndexOutOfBoundsException: length=36; index=36
04-03 11:46:41.857: W/System.err(16255):     at com.example.portablemusicstudio.FileListActivity.onItemClick(FileListActivity.java:158)
04-03 11:46:41.857: W/System.err(16255):     at android.widget.AdapterView.performItemClick(AdapterView.java:334)
04-03 11:46:41.857: W/System.err(16255):     at android.widget.AbsListView.performItemClick(AbsListView.java:1544)
04-03 11:46:41.867: W/System.err(16255):     at android.widget.AbsListView$PerformClick.run(AbsListView.java:3682)
04-03 11:46:41.867: W/System.err(16255):     at android.widget.AbsListView.onTouchUp(AbsListView.java:5611)
04-03 11:46:41.867: W/System.err(16255):     at android.widget.AbsListView.onTouchEvent(AbsListView.java:5377)
04-03 11:46:41.867: W/System.err(16255):     at android.view.View.dispatchTouchEvent(View.java:9010)
04-03 11:46:41.867: W/System.err(16255):     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2672)
04-03 11:46:41.867: W/System.err(16255):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2384)
04-03 11:46:41.867: W/System.err(16255):     at android.widget.AbsListView.dispatchTouchEvent(AbsListView.java:5314)
04-03 11:46:41.867: W/System.err(16255):     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2683)
04-03 11:46:41.867: W/System.err(16255):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2399)
04-03 11:46:41.867: W/System.err(16255):     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2683)
04-03 11:46:41.867: W/System.err(16255):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2399)
04-03 11:46:41.867: W/System.err(16255):     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2683)
04-03 11:46:41.867: W/System.err(16255):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2399)
04-03 11:46:41.867: W/System.err(16255):     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2683)
04-03 11:46:41.867: W/System.err(16255):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2399)
04-03 11:46:41.867: W/System.err(16255):     at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2552)
04-03 11:46:41.867: W/System.err(16255):     at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1767)
04-03 11:46:41.867: W/System.err(16255):     at android.app.Activity.dispatchTouchEvent(Activity.java:2840)
04-03 11:46:41.867: W/System.err(16255):     at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2513)
04-03 11:46:41.867: W/System.err(16255):     at android.view.View.dispatchPointerEvent(View.java:9228)
04-03 11:46:41.867: W/System.err(16255):     at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4665)
04-03 11:46:41.867: W/System.err(16255):     at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4503)
04-03 11:46:41.867: W/System.err(16255):     at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4053)
04-03 11:46:41.867: W/System.err(16255):     at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4106)
04-03 11:46:41.867: W/System.err(16255):     at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4072)
04-03 11:46:41.867: W/System.err(16255):     at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4186)
04-03 11:46:41.867: W/System.err(16255):     at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4080)
04-03 11:46:41.867: W/System.err(16255):     at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:4243)
04-03 11:46:41.867: W/System.err(16255):     at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4053)
04-03 11:46:41.867: W/System.err(16255):     at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4106)
04-03 11:46:41.867: W/System.err(16255):     at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4072)
04-03 11:46:41.867: W/System.err(16255):     at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4080)
04-03 11:46:41.867: W/System.err(16255):     at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4053)
04-03 11:46:41.867: W/System.err(16255):     at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:6513)
04-03 11:46:41.867: W/System.err(16255):     at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:6412)
04-03 11:46:41.867: W/System.err(16255):     at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:6383)
04-03 11:46:41.867: W/System.err(16255):     at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:6603)
04-03 11:46:41.867: W/System.err(16255):     at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185)
04-03 11:46:41.867: W/System.err(16255):     at android.os.MessageQueue.nativePollOnce(Native Method)
04-03 11:46:41.867: W/System.err(16255):     at android.os.MessageQueue.next(MessageQueue.java:143)
04-03 11:46:41.867: W/System.err(16255):     at android.os.Looper.loop(Looper.java:130)
04-03 11:46:41.867: W/System.err(16255):     at android.app.ActivityThread.main(ActivityThread.java:5834)
04-03 11:46:41.867: W/System.err(16255):     at java.lang.reflect.Method.invoke(Native Method)
04-03 11:46:41.867: W/System.err(16255):     at java.lang.reflect.Method.invoke(Method.java:372)
04-03 11:46:41.867: W/System.err(16255):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1388)
04-03 11:46:41.867: W/System.err(16255):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1183)

play의 배열길이가 36이고
a+8의 값을 출력했더니 로그켓에 시스템 에러가 뜨네요ㅠㅠ
원리를 잘 모르겠는데 핸들러 안에서 a+8을 출력하니까 배열길이가 36이면 계속 44로 나오네요;; 포문을 다돌고 들어가는 건가요?
0 추천

"for(a_ = 0; a_<=play_.length; a_+=9)" 에서 최종 a_ 값은 'play_크기-8' ~ 'play_크기' 입니다.

play_ 참조시 a_+8 하니까 당연히 오류가 발생하죠.

 

해결방법 1. for(a_ = 0; a_<=play_.length-9; a_+=9)

해결방법 2. if (a_+8 < play_.length) mSoundManager.playSound (...)

 

그런데 이 코드가 동작을 하기는 하나요? a_ 값은 휙~ 증가되어버리고,

일정시간후 thread 가 동작할때는 모두 같은 a_ 값을 가지고, 같은 소리를 연주할 것 같은데요...

JINASYS (5,630 포인트) 님이 2015년 4월 3일 답변
...