1、最近照的源码就是Timber这个开源的音乐播放器,花了大概一段时间,大概搞懂了部分的代码含义。 首先Timber并没有使用什么第三方的数据库框架,使用的都是android自带的sqlite。同时,timber没有把contentProvider中扫描到的歌曲再一次存入到本地数据库,而是每一次打开app都从contentProvider中获取···(这跟我一开始想的不一样啊···),而且主要是,Timber的读取速度超级快啊···(可能这跟我没有新开一个线程来读取有关系),从网上的一些信息上来看音乐的播放都是Service里面进行播放的。
2、现在把音乐的播放放到service中进行,但是在初始化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没有得到执行,网上看了,只要:
bindService()方法执行成功同时onBind()方法返回非空IBinder对象
这个onServiceConnected就会得到执行···,我的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();
}
}
}
我们发现onBind()
这个方法也正确返回了binder对象,但是就是有问题,所以只能最后只能判断musicService是否为空来重新手动创建Service对象:
if (musicService==null)
{
musicService = new MusicService();
}
这样做后续暂时没有发现问题···
3、上述的方法极度愚蠢,现在已经抛弃
4、getContentResolver().query()
的速度并不慢!!很快的!!