从IntentService

时间:2018-07-13 22:37:43

标签: java android mediastore android-intentservice

我有一个IntentService,可以查询MediaStore以获取歌曲,专辑,艺术家等等。这样,如果有人尝试添加整个歌手,并且有很多专辑,那么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();
            }
        }
    }
};
...
@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需要能够多次重新发送。这是否可能,或者我需要将其分为2个不同的IntentService调用,一个获得第一个项目,然后另一个获得其余项目?

1 个答案:

答案 0 :(得分:1)

  

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

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

  

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

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