안녕하세요 몇일전 mp3 예제 질문올렸었는데요 어떻게 도움받아서 하다보니 완성이 됐습니다.
근데 음악을 실행할 떄 끊김이 뚝뚝.. 생가네요 제 생각엔 쓰레드 문제인거 같다... 라고 생각만 하는데 어떻게 손대야 할 지 모르겠네요 쓰레드 부분에서는 seekbar랑 textview만 건드리는데 왜 노래가 끊기는지 참.. 도와주세요 ㅠㅠ
로그캣도 정상실행이라 따로 올려드릴껀 없는 것 같습니다!

package com.example.mp3player02;

import java.io.File;
import java.io.FilenameFilter;
import java.io.IOException;
import java.text.*;
import java.util.ArrayList;
import java.util.List;

import android.app.ListActivity;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.media.MediaPlayer.OnPreparedListener;
import android.net.Uri;
import android.os.*;
import android.provider.MediaStore;
import android.view.*;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.TabHost;
import android.widget.TextView;

public class MainActivity extends ListActivity implements Runnable{
public String searname;// ROOT 占쏙옙罐占�
private static final String MEDIA_PATH = new String("/sdcard/");
SeekBar sbmusic;
TextView tvtitle;
TextView tvartist;
static ImageView albumimage;
TextView tvnow;
TextView tvend;
SeekBar sbvol;
EditText edit;// 占쏙옙占쏙옙占쌌니댐옙.
ListView searchlist;
ListView sellist;
Button prevbtn, playbtn, nextbtn;
Bitmap albumart;
final Handler handler = new Handler();
public List<String> search;
private List<String> songs = new ArrayList<String>();
List<String> positions = new ArrayList<String>();
ArrayList<String> musicIDList = new ArrayList<String>(5);
ArrayList<String> musicTitleList = new ArrayList<String>(5);
ArrayList<String> musicDataList = new ArrayList<String>(5);
ArrayList<String> albumIdList = new ArrayList<String>(5);
ArrayList<String> musicartistList = new ArrayList<String>(5);
private MediaPlayer mp = new MediaPlayer();

private int currentPosition = 0; // 占쏙옙占쏙옙占�占쏙옙占쏙옙 占쏙옙치占쌉니댐옙.

public void run() {
int current = 0;
while(mp!=null) {
try {
Thread.sleep(1000);
current = mp.getCurrentPosition();
}catch (Exception e) {}
if(mp.isPlaying()) {
sbmusic.setProgress(current);
}
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);
final AudioManager audio = (AudioManager)getSystemService(AUDIO_SERVICE);
tvtitle = (TextView)findViewById(R.id.textView1);
tvartist = (TextView)findViewById(R.id.textView2);
albumimage = (ImageView)findViewById(R.id.imageView1);
tvnow = (TextView)findViewById(R.id.nowseekview);
tvend = (TextView)findViewById(R.id.endseekview);
sbvol = (SeekBar)findViewById(R.id.seekvolumn);
sbmusic = (SeekBar)findViewById(R.id.seekBar1);
playbtn = (Button)findViewById(R.id.play);
prevbtn = (Button)findViewById(R.id.prev);
nextbtn = (Button)findViewById(R.id.next);
int sMax = audio.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
int svol = audio.getStreamVolume(AudioManager.STREAM_MUSIC);
sbvol.setMax(sMax);
sbvol.setProgress(svol);
sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"
                + Environment.getExternalStorageDirectory())));
TabHost tabhost = (TabHost) findViewById(R.id.tabhost);
tabhost.setup();
TabHost.TabSpec spec;
spec = tabhost.newTabSpec("tab1");
spec.setContent(R.id.tab1);
spec.setIndicator("tab1");
tabhost.addTab(spec);
spec = tabhost.newTabSpec("tab2");
spec.setContent(R.id.tab2);
spec.setIndicator("tab2");
tabhost.addTab(spec);
spec = tabhost.newTabSpec("tab3");
spec.setContent(R.id.tab3);
spec.setIndicator("search");
tabhost.addTab(spec);
spec = tabhost.newTabSpec("tab4");
spec.setContent(R.id.tab4);
spec.setIndicator("play");
tabhost.addTab(spec);
tabhost.setCurrentTab(0);
updateSongList();

Button sear = (Button) findViewById(R.id.sear);
final EditText seartext = (EditText) findViewById(R.id.seartext);
searchlist = (ListView) findViewById(R.id.searlist);
sellist = (ListView) findViewById(R.id.selectlist);
String [] musicinfo = {MediaStore.Audio.Media._ID,
MediaStore.Audio.Media.DATA,
MediaStore.Audio.Media.TITLE,
MediaStore.Audio.Media.ARTIST,
MediaStore.Audio.Media.ALBUM_ID};
Cursor mcursor = managedQuery(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, musicinfo, null, null, null);
final SimpleDateFormat format = new SimpleDateFormat("H:mm:ss");
if(mcursor != null && mcursor.moveToFirst()) {
String musicID;
String musictitle;
String musicdata;
String albumID;
String musicartist;
int musicIdcol = mcursor.getColumnIndex(MediaStore.Audio.Media._ID);
int musictitlecol = mcursor.getColumnIndex(MediaStore.Audio.Media.TITLE);
int musicdatacol = mcursor.getColumnIndex(MediaStore.Audio.Media.DATA);
int albumIdcol = mcursor.getColumnIndex(MediaStore.Audio.Media.ALBUM_ID);
int musicartistcol = mcursor.getColumnIndex(MediaStore.Audio.Media.ARTIST);
do {
musicID = mcursor.getString(musicIdcol);
musictitle = mcursor.getString(musictitlecol);
musicdata = mcursor.getString(musicdatacol);
albumID = mcursor.getString(albumIdcol);
musicartist = mcursor.getString(musicartistcol);
musicIDList.add(musicID);
musicTitleList.add(musictitle);
musicDataList.add(musicdata);
albumIdList.add(albumID);
musicartistList.add(musicartist);
}while(mcursor.moveToNext());
}
sear.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
searname = seartext.getText().toString();
searupdateSongList();

}
});
// SD카占쏙옙觀占쏙옙占�占쏙옙占쏙옙 占쏙옙占쏙옙占�占쌀뤄옙占쏙옙占쏙옙 占쏙옙占쏙옙占쏙옙 占쌌니댐옙.

searchlist.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view,

int position, long id) {

currentPosition = position;
TextView tv1 = (TextView) parent.getChildAt(position)
.findViewById(R.id.sear_song_item_layout);
refresh(tv1.getText().toString());

}
});
playbtn.setOnClickListener(new OnClickListener( ){
public void onClick(View v) {
if(mp.isPlaying()) {
mp.pause();
playbtn.setText("play");
}
else if(!mp.isPlaying()) {
mp.start();
playbtn.setText("pause");
}
}
});
prevbtn.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
int current = mp.getCurrentPosition();
if(current - 20000 < 0) {
mp.seekTo(0);
}
else {
mp.seekTo(current - 20000);
}
}
});
nextbtn.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
int current = mp.getCurrentPosition();
int total = mp.getDuration();
if(current + 20000 > total) {
mp.seekTo(total);
}
else {
mp.seekTo(current + 20000);
}
}
});
sellist.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
currentPosition = position;
String filen = sellist.getItemAtPosition(position).toString();
 
for(int i=0; i<songs.size(); ++i) {
String tempstr = musicDataList.get(i).toString();
int cutindex = tempstr.lastIndexOf("/")+1;
tempstr = tempstr.substring(cutindex);
if(musicDataList.get(i).toString() != null && filen.equals(tempstr)) {
getArtworkQuick(MainActivity.this, Integer.parseInt(albumIdList.get(i).toString()), 100, 100);
tvtitle.setText(musicTitleList.get(i).toString() +  " - " +musicartistList.get(i).toString());
}
}
playSong(MEDIA_PATH +positions.get(position));
}
private void playSong(String songPath) {
sbmusic.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
public void onStopTrackingTouch(SeekBar seekbar) {
}
public void onProgressChanged(SeekBar seekbar, int progress, boolean fromuser) {
mp.seekTo(progress);
sbmusic.setProgress(progress);
int min = progress / 60000;
int sec = (progress % 60000) / 1000;
tvnow.setText(min + " : " + sec );
}
public void onStartTrackingTouch(SeekBar arg0) {

}
});
sbvol.setOnSeekBarChangeListener(
new OnSeekBarChangeListener() {
public void onStopTrackingTouch(SeekBar seekbar) {
}
public void onProgressChanged(SeekBar seekbar, int progress, boolean fromuser) {
audio.setStreamVolume(AudioManager.STREAM_MUSIC, progress, 0);
}
public void onStartTrackingTouch(SeekBar arg0) {

}
});
try {

mp.reset();
mp.setDataSource(songPath);
mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
mp.setOnCompletionListener(new OnCompletionListener() {

public void onCompletion(MediaPlayer arg0) {

nextSong();

}

});
mp.prepare();
new Thread(MainActivity.this).start();
sbmusic.setVisibility(ProgressBar.VISIBLE);
sbmusic.setProgress(0);
sbmusic.setMax(mp.getDuration());
tvend.setText(format.format(mp.getDuration()));
mp.setOnPreparedListener(new OnPreparedListener() {
public void onPrepared(MediaPlayer mp) {
mp.start();
}
});


} catch (IOException e) {

}
}
// 한 곡의 재생이 끝나면 다음 곡을 재생하도록 합니다.
void nextSong() {

if (++currentPosition >= positions.size()) {

// 마지막 곡이 끝나면, 재생할 곡을 초기화합니다.

currentPosition = 0;

} else {

// 다음 곡을 재생합니다.
playSong(MEDIA_PATH + positions.get(currentPosition));

}

}

});

}
public void updateSongList() {
File home = new File(MEDIA_PATH);

if (home.listFiles(new Mp3Filter()).length > 0) {

for (File file : home.listFiles(new Mp3Filter())) {

songs.add(file.getName());

}

ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
R.layout.song_item, songs);

setListAdapter(adapter);

}

}

public void searupdateSongList() {

File home = new File(MEDIA_PATH);
search = new ArrayList<String>();
if (home.listFiles(new SearchFilter()).length > 0) {

for (File file : home.listFiles(new SearchFilter())) {

search.add(file.getName());

}

ArrayAdapter<String> arrayAdapter1 = new ArrayAdapter<String>(
getApplicationContext(), R.layout.sear_song_item, search);

searchlist.setAdapter(arrayAdapter1);

}

}

// List 占쏙옙占쏙옙占쏙옙占쏙옙 클占쏙옙占쏙옙占쏙옙 占쏙옙占쏙옙 event占쏙옙 처占쏙옙占쌌니댐옙.

protected void onListItemClick(ListView l, View v, int position, long id) {

currentPosition = position;
TextView tv = (TextView) l.getChildAt(position).findViewById(
R.id.song_item_layout);
refresh(tv.getText().toString());

}

void refresh(String str) {
positions.add(str);
ListView sellist = (ListView) findViewById(R.id.selectlist);
ArrayAdapter<String> arrada = new ArrayAdapter<String>(
getApplicationContext(), R.layout.select_item, positions);
sellist.setAdapter(arrada);

}

class SearchFilter implements FilenameFilter {

public boolean accept(File dir, String name) {

return (name.endsWith(searname + ".mp3"));

}

}

protected void onDestroy() {
if(mp != null) {
mp.release();
}
super.onDestroy();
}
private static final BitmapFactory.Options sBitmapOptionsCache = new BitmapFactory.Options();
    private static final Uri sArtworkUri = Uri.parse("content://media/external/audio/albumart");
    

    private void getArtworkQuick(Context context, int album_id, int w, int h) {
        w -= 2;
        h -= 2;
        ContentResolver res = context.getContentResolver();
        Uri uri = ContentUris.withAppendedId(sArtworkUri, album_id);
        ImageView albumart = (ImageView)findViewById(R.id.imageView1);
        albumart.setImageURI(uri);
    }
}

class Mp3Filter implements FilenameFilter {

public boolean accept(File dir, String name) {

return (name.endsWith(".mp3"));

}
 
}