【问题标题】:send results multiple times from IntentService从 IntentService 多次发送结果
【发布时间】:2018-07-13 22:37:43
【问题描述】:

我有一个 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);
    }
}

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 调用,一个用于获取第一个项目,然后另一个用于获取其余部分?

【问题讨论】:

    标签: java android mediastore android-intentservice


    【解决方案1】:

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

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

    这意味着 IntentService 需要能够进行多次rec.send。有可能吗

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

    【讨论】:

    • 美丽。谢谢你。我想把它作为一个 AsyncTask 来做。我过去曾使用过它们,但我认为 IntentService 也将允许我的应用程序在未来进行更新,以包含诸如 MediaScanner 完整事件之类的内容。因此,当某些事情发生在我的应用之外时,我的应用也可以自动更新。
    • @NeglectedSanity:您提出的方案可能更好地证明了IntentService 的合理性,但我仍然持怀疑态度。无论如何,您最好将其与您现有的东西一起使用,如果您当前的方法过于复杂,您可以考虑未来可能发生的变化。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-28
    • 1970-01-01
    • 2016-04-18
    • 1970-01-01
    • 1970-01-01
    • 2015-07-20
    • 2013-11-05
    相关资源
    最近更新 更多