1. 程式人生 > >每天記錄學習的新知識:Observable

每天記錄學習的新知識:Observable

使用RxJava,需要新增依賴

    //rxjava
    implementation 'io.reactivex:rxjava:1.0.14'
    implementation 'io.reactivex:rxandroid:1.0.1'

1.Observable一種同步的簡單用法

1.1.返回Observable 的本地音樂掃描

    public Observable refreshHDDAudioData(final Context context) {

        return Observable.create(new Observable.OnSubscribe<LocalAudioData>() {
            @Override
            public void call(Subscriber<? super LocalAudioData> subscriber) {

                hddLock.lock(); // 得到鎖

                if (context != null) {

                    ContentResolver contentResolver = context.getContentResolver();
                    Cursor cursor = contentResolver.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null, MediaStore.Audio.Media.DEFAULT_SORT_ORDER);

                    if (cursor != null) {

                        LocalAudioData localAudioData = new LocalAudioData();

                        if (cursor.moveToFirst()) {
                            for (int i = 0; i < cursor.getCount(); i++) {
                                MediaInfo mediaInfo = new MediaInfo();
                                long id = cursor.getLong(cursor.getColumnIndex(MediaStore.Audio.Media._ID));
                                String title = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.TITLE));
                                String artist = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST));
                                long duration = cursor.getLong(cursor.getColumnIndex(MediaStore.Audio.Media.DURATION));
                                long size = cursor.getLong(cursor.getColumnIndex(MediaStore.Audio.Media.SIZE));
                                String url = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA));
                                String album = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM));
                                long album_id = cursor.getLong(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM_ID));
                                int ismusic = cursor.getInt(cursor.getColumnIndex(MediaStore.Audio.Media.IS_MUSIC));

                                if (ismusic != 0 && duration / (500 * 60) >= 1) {
                                    mediaInfo.setId(id);
                                    mediaInfo.setMediaName(title);
                                    mediaInfo.setMediaArtist(artist);
                                    mediaInfo.setDuration(duration);
                                    mediaInfo.setUri(url);
                                    mediaInfo.setMediaAlbum(album);
                                    mediaInfo.setPosition(i);
                                    mediaInfo.setMediaSource(Const.MediaSource.LOCAL_AUDIO);
                                    hddAudioList.add(mediaInfo);
                                }

                                cursor.moveToNext();
                            }
                        }

                        localAudioData.setLocalType(Const.LocalDataSource.HDD_AUDIO);
                        localAudioData.setAudioInfoList(hddAudioList);
                        hddLock.unlock();
                        cursor.close();
                        cursor = null;
                        if (subscriber != null) {
                            subscriber.onNext(localAudioData);
                            subscriber.onCompleted();
                        }

                    } else {
                        hddLock.unlock();
                        if (subscriber != null)
                            subscriber.onError(new IllegalArgumentException(ScanErrorState.SCAN_ERROR_CURSOR));
                    }
                } else {
                    hddLock.unlock();
                    if (subscriber != null)
                        subscriber.onError(new IllegalArgumentException(ScanErrorState.SCAN_ERROR_CONTEXT));
                }
            }
        });
    }

1.2 監聽Observable

            refreshHDDAudioData(context).subscribe(new Observer<LocalAudioData>() {
                
                @Override
                public void onCompleted() {

				    //可以在這裡回撥獲得的音樂資料
                    LogUtils.i(TAG,"onCompleted ");
                }
                
                @Override
                public void onError(Throwable e) {
                    isRequestHDDAudioDataing = false;
                    LogUtils.i(TAG, "onError:" + e);
                }

                @Override
                public void onNext(LocalAudioData localAudioData) {

                    LogUtils.i(TAG, "onNext localAudioData:" + localAudioData.getAudioInfoList().size());
                    HDDServiceDataManager.localAudioData = localAudioData;
                }
            });