일단 쓰레드를 사용하고 있구요.
ListView를 setAdapter를 통해 셋팅 해주어 불러온 후
추후에 리스트뷰의 내용을 바꾸기 위해서
내용의 변화가 있을 때 마다
mHandler.sendEmptyMessageDelayed(MUSIC_VIEW_REF2, 1000);
위와 같이 핸들러를 통해 아래의 내용들을 불러옵니다.
어떨때는 잘되는데 어떨때는 에러가 나구요..
music_thread.interrupt();
music_thread = null;
ia.notifyDataSetChanged();
mListView.setAdapter(ia);
mListView.setSelector(color.transparent);
Click_Music_Main();
아래는 로그입니다.
11-01 13:34:18.808: E/AndroidRuntime(22402): java.lang.IllegalStateException: The content of the adapter has changed but ListView did not receive a notification. Make sure the content of your adapter is not modified from a background thread, but only from the UI thread.
휴.. 그래도 계속 같은 증상이 발생하는데... 쓰레드 안에 미디어스토어에서 쿼리해오는 부분이 있거든요..
혹시 이 부분이 문제가 될 수 있나요?? 아래의 내용이 쓰레드 안에서 처리하는 부분입니다...
int cnt = 0;
String[] mCursorCols = new String[]{
MediaStore.Audio.Media._ID,
MediaStore.Audio.Media.ARTIST,
MediaStore.Audio.Media.TITLE,
MediaStore.Audio.Media.ALBUM,
MediaStore.Audio.Media.DATA
// MediaStore.Audio.Media.
};
Cursor cur = getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, mCursorCols, null, null, null);
cur.moveToFirst();
if( cur.moveToFirst() ){
String title, artist, album, path;
int pathColumn = cur.getColumnIndex(MediaStore.Audio.Media.DATA);
int titleColumn = cur.getColumnIndex(MediaStore.Audio.Media.TITLE);
int artistColumn = cur.getColumnIndex(MediaStore.Audio.Media.ARTIST);
int albumColumn = cur.getColumnIndex(MediaStore.Audio.Media.ALBUM);
do{
path = cur.getString(pathColumn);
title = cur.getString(titleColumn);
artist = cur.getString(artistColumn);
album = cur.getString(albumColumn);
if(MediaPlayer.create(getApplicationContext(), Uri.parse(path)) == null)
{
Log.d("MUSIC TITLE", "NULL");
}else
{
Log.d("MUSIC TITLE", path);
mMusicPath.add(path);
mMusicNames.add(title);
mMusicArtist.add(artist);
mMusicAlbum.add(album);
mMusicDuration.add(MediaPlayer.create(getApplicationContext(), Uri.parse(path)).getDuration());
}
cnt++;
}while(cur.moveToNext());
}
cur.close();
ia.notifyDataSetChanged(); 후에 mListView.setAdapter(ia); 는 왜 하시는지?
다시 그리는작업은 notify 만 해주시면 됩니다. setAdapter 를 하면 리스트가 다 지워졌다가 다시 그려질텐데요
그리고 Handler 쓰지 마시고 runOnUiThread 사용하세요.