从 IntentService 多次发送结果

send results multiple times from IntentService

我有一个查询 MediaStore 以获取歌曲、专辑、艺术家等的 IntentService。这样,如果有人试图添加整个艺术家并且有很多专辑,IntentService 可以执行昂贵的操作,从艺术家那里获取所有专辑,然后循环遍历它们以获取每张专辑中的所有歌曲,它不会占用 ui 以便应用程序仍然可以运行。我的 problem/question 是,有没有办法从同一个服务调用多次发送结果?

示例:有人点击了一位艺术家。这会使用 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();
            }
        }
    }
};
...
@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);
    }
}

GetPlaylistItemsService...

@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 调用,一个获取第一个项目,另一个获取其余项目?

it won't take up the ui so the app can still function

您不需要 IntentService。一个普通的后台线程(可能绑定到 LiveData)、AsyncTask、RxJava 链等可以处理这个。

That would mean the IntentService would need to be able to rec.send more than once. Is that possible

当然可以。使用普通的后台线程、AsyncTask、RxJava 链等会更有效。但是,你应该能够 send() 任意多次。结果将一次传递给 onReceiveResult()(即,您调用 send() 6 次,您得到 6 个 onReceiveResult() 调用)。