版权声明:随便转都是学别人的 https://blog.csdn.net/weixin_35691921/article/details/84969863
使用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;
}
});