为了账号安全,请及时绑定邮箱和手机立即绑定

从IntentService多次发送结果

从IntentService多次发送结果

慕桂英4014372 2021-05-03 10:23:23
我有一个查询MediaStore的IntentService,以获取歌曲,专辑,艺术家等等。这样,如果有人尝试添加整个艺术家,并且有很多专辑,那么IntentService可以执行昂贵的操作,从艺术家那里获取所有专辑,然后遍历它们以获取每个专辑中的所有歌曲,而不会占用用户界面,以便该应用程序仍能正常运行。我的问题是,是否可以通过同一服务呼叫多次发送结果?示例:某人点击某个艺术家。那将使用artist_id启动IntentService,然后IntentService开始执行其工作。我想发生的是,IntentService先获得第一张专辑,然后获得第一首歌曲,然后将结果发送回去,但是它还会继续处理其余专辑和歌曲,然后在完成后将其全部发送回去。 。我不知道这是否有意义,所以这是我当前设置的一个示例...BaseActivity ...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();            }        }    }};...@Overridepublic 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);    }}GetPlaylistItemsService ...@Overrideprotected 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);  }我想要做的是多次发送“ rec.send ...”。这样,我可以获得第一张专辑和第一首歌曲,然后将结果发送回去,以便媒体播放器可以开始播放它,然后在后台处理其余部分,并在完成后添加它们。这意味着IntentService需要能够多次重新发送。这是否可能,或者我需要将其分为2个不同的IntentService调用,一个调用获取第一项,然后另一个调用以获得其余项?
查看完整描述

1 回答

?
哔哔one

TA贡献1854条经验 获得超8个赞

它不会占用用户界面,因此该应用程序仍可以正常运行

您不需要IntentService为此。普通的后台线程(可能绑定到LiveDataAsyncTask,RxJava链等都可以处理此问题。

这意味着IntentService需要能够多次重新发送。那可能吗

当然。使用普通的后台线程AsyncTaskRxJava链等会更有效。但是,您应该可以随意执行send()多次。结果将一次传递给onReceiveResult()一个(即,您呼叫send()6次,您得到6次onReceiveResult()呼叫)。


查看完整回答
反对 回复 2021-05-26
  • 1 回答
  • 0 关注
  • 174 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信