每天記錄學習的新知識:Observable
阿新 • • 發佈:2018-12-12
使用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; } });