腾讯轻听模仿流水账(5):16.12.13

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()的速度并不慢!!很快的!!

你可能感兴趣的:(腾讯轻听模仿流水账(5):16.12.13)