java - 从 IntentService 多次发送结果
问题描述
我有一个 IntentService 查询 MediaStore 以获取歌曲、专辑、艺术家等。这样,如果有人试图添加一个完整的艺术家并且有很多专辑,IntentService 可以执行昂贵的操作,从艺术家那里获取所有专辑,然后循环遍历它们以从每个专辑中获取所有歌曲,它不会占用用户界面,以便应用程序仍然可以运行。我的问题/问题是,有没有办法从同一个服务调用中多次发送结果?
示例:有人点击艺术家。这将使用 Artist_id 启动 IntentService,然后 IntentService 开始工作。我想要发生的是,IntentService 获取第一张专辑,然后是第一首歌曲并将结果发回,但它还会继续处理其余的专辑和歌曲,然后在完成后将它们全部发回. 我不知道这是否有意义,所以这是我当前设置的一个示例...
基础活动...
public GetSongsReceiver receiver;
public GetSongsReceiver.Receiver returnReceiver = new GetSongsReceiver.Receiver() {
@Override
public void onReceiveResult(int resultCode, Bundle resultData) {
if(resultCode == RESULT_OK) {
ArrayList<Song> songs = resultData.getParcelableArrayList("songs");
if(songs != null && songs.size() > 0) {
if(musicBound) {
musicService.addAllSongs(songs);
musicService.playSong();
}
}
}
};
...
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
//processing and such.
if(musicBound) {
musicService.setPlayType(MusicService.PlayType.ARTIST);
Intent i = new Intent(BaseActivity.this, GetPlaylistItemsService.class);
Bundle extras = new Bundle();
extras.putParcelable("key", data.getParcelableExtra("artist"));
extras.putString("service_type", "artist");
extras.putParcelable("receiver", returnReceiver);
i.putExtras(extras);
startService(i);
}
}
获取播放列表项服务...
@Override
protected void onHandleIntent(Intent intent) {
ResultReceiver rec = intent.getParcelableExtra("receiver");
Artist artist = intent.getParcelableExtra("key");
ArrayList<Album> albums = getAlbumsFromArtist(artist);
ArrayList<Song> songs = new ArrayList<>();
for(Album album : albums) {
songs.addAll(getSongsFromAlbum(album);
}
Bundle extras = new Bundle();
extras.putParcelableArrayList("songs", songs);
rec.send(Activity.RESULT_OK, extras);
}
我想做的是让“rec.send ...”发送不止一次。这样我就可以获得第一张专辑和第一首歌曲,将结果发回以便媒体播放器开始播放,然后在后台处理其余部分,并在完成后添加它们。这意味着 IntentService 需要能够进行多次rec.send。这是可能的还是我需要将其分解为 2 个不同的 IntentService 调用,一个获取第一个项目,然后另一个获取其余部分?
解决方案
它不会占用用户界面,因此应用程序仍然可以运行
您不需要IntentService
为此。一个普通的后台线程(可能绑定到一个LiveData
)AsyncTask
、RxJava 链等可以处理这个问题。
这意味着 IntentService 需要能够进行多次rec.send。那可能吗
当然。使用普通的后台线程、RxJava 链等会更有效AsyncTask
。但是,您应该可以任意send()
多次使用。结果将一次传递给onReceiveResult()
一个(即,您调用send()
6 次,您将收到 6 个onReceiveResult()
调用)。