1、最近照的源碼就是Timber這個開源的音樂播放器,花了大概一段時間甲献,大概搞懂了部分的代碼含義。 首先Timber并沒有使用什么第三方的數(shù)據(jù)庫框架颂翼,使用的都是android自帶的sqlite晃洒。同時,timber沒有把contentProvider中掃描到的歌曲再一次存入到本地數(shù)據(jù)庫朦乏,而是每一次打開app都從contentProvider中獲取···(這跟我一開始想的不一樣啊···)球及,而且主要是,Timber的讀取速度超級快啊···(可能這跟我沒有新開一個線程來讀取有關(guān)系)呻疹,從網(wǎng)上的一些信息上來看音樂的播放都是Service里面進(jìn)行播放的吃引。
2、現(xiàn)在把音樂的播放放到service中進(jìn)行刽锤,但是在初始化Service的時候出了問題:
private SongPlayerInteractor(Context mContext)
{
this.mContext = mContext; //這里要獲取全局變量
this.mediaPlayer = new MediaPlayer();
bindService();
}
private void bindService()
{
//綁定Service
ServiceConnection serviceConnection=new ServiceConnection()
{
@Override
public void onServiceConnected(ComponentName name, IBinder service)
{
musicService= ((MusicService.MyBinder) service).getService();
}
@Override
public void onServiceDisconnected(ComponentName name)
{
}
};
Intent intent=new Intent(mContext,MusicService.class);
// mContext.startService(intent);
mContext.bindService(intent,serviceConnection,mContext.BIND_AUTO_CREATE);
}
public static synchronized SongPlayerInteractor getPlayerInteractor(Context context)
{
if (uniqueSongPlayerInteractor == null)
{
uniqueSongPlayerInteractor = new SongPlayerInteractor(context);
}
return uniqueSongPlayerInteractor;
}
最后返回的uniqueSongPlayerInteractor中的musicService始終未null镊尺,也就是說ServiceConnect的onServiceConnected沒有得到執(zhí)行,網(wǎng)上看了并思,只要:
bindService()方法執(zhí)行成功同時onBind()方法返回非空IBinder對象
這個onServiceConnected就會得到執(zhí)行···庐氮,我的Service代碼:
public class MusicService extends Service
{
MediaPlayer mediaPlayer;
MyBinder binder= new MyBinder();
public class MyBinder extends Binder{
public MusicService getService(){
return MusicService.this;
}
}
//初始化MediaPlayer
@Override
public void onCreate()
{
super.onCreate();
mediaPlayer = new MediaPlayer();
}
@Nullable
@Override
public IBinder onBind(Intent intent)
{
return binder;
}
public void playMusic(String fileName)
{
try
{
if (mediaPlayer.isPlaying())
mediaPlayer.reset();
if(mediaPlayer==null)
mediaPlayer=new MediaPlayer();
mediaPlayer.setDataSource(fileName);
try
{
mediaPlayer.prepare();
}catch (IllegalStateException e)
{
Log.d("player error",e.toString());
}
mediaPlayer.start();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
我們發(fā)現(xiàn)onBind()
這個方法也正確返回了binder對象,但是就是有問題宋彼,所以只能最后只能判斷musicService是否為空來重新手動創(chuàng)建Service對象:
if (musicService==null)
{
musicService = new MusicService();
}
這樣做后續(xù)暫時沒有發(fā)現(xiàn)問題···
3弄砍、上述的方法極度愚蠢仙畦,現(xiàn)在已經(jīng)拋棄
4、getContentResolver().query()
的速度并不慢R羯簟慨畸!很快的!桃熄!