Java 从IntentService多次发送结果

Java 从IntentService多次发送结果,java,android,mediastore,android-intentservice,Java,Android,Mediastore,Android Intentservice,我有一个IntentService查询MediaStore以获取歌曲、专辑、艺术家等等。这样,如果有人试图添加一个完整的艺术家,并且有很多专辑,IntentService可以执行昂贵的操作,从一个艺术家那里获取所有专辑,然后通过它们循环获取每个专辑中的所有歌曲,这样就不会占用ui,因此应用程序仍然可以正常运行。我的问题是,有没有一种方法可以从同一个服务呼叫多次发送结果 有人点击了一位艺术家。这将使用艺术家id启动IntentService,IntentService开始工作。我想发生的是,Int

我有一个IntentService查询MediaStore以获取歌曲、专辑、艺术家等等。这样,如果有人试图添加一个完整的艺术家,并且有很多专辑,IntentService可以执行昂贵的操作,从一个艺术家那里获取所有专辑,然后通过它们循环获取每个专辑中的所有歌曲,这样就不会占用ui,因此应用程序仍然可以正常运行。我的问题是,有没有一种方法可以从同一个服务呼叫多次发送结果

有人点击了一位艺术家。这将使用艺术家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);
    }
}
publicGetSongsReceiver接收器;
public GetSongsReceiver.Receiver returnReceiver=新建GetSongsReceiver.Receiver(){
@凌驾
ReceiveResult(int resultCode,Bundle resultData)上的公共无效{
if(resultCode==RESULT\u OK){
ArrayList songs=resultData.getParcelableArrayList(“歌曲”);
if(songs!=null&&songs.size()>0){
如果(音乐声){
音乐服务。添加所有歌曲(歌曲);
musicService.playSong();
}
}
}
};
...
@凌驾
ActivityResult上的公共void(int请求代码、int结果代码、意图数据){
//加工等。
如果(音乐声){
musicService.setPlayType(musicService.PlayType.Artister);
意向i=新意向(BaseActivity.this,getPlaylayItemsService.class);
Bundle extras=新Bundle();
额外的putParcelable(“key”,data.getParcelableExtra(“artist”);
额外输入字符串(“服务类型”、“艺术家”);
可额外寄存(“接收者”,返回接收者);
i、 临时演员(临时演员);
startService(一);
}
}
GetPlayItemsService

@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);
}
@覆盖
受保护的手部内容无效(意图){
ResultReceiver rec=intent.getParcelableExtra(“接收者”);
艺术家=intent.getParcelableExtra(“密钥”);
ArrayList albums=getAlbumsFromArtist(艺术家);
ArrayList歌曲=新建ArrayList();
用于(相册:相册){
歌曲.addAll(getSongsFromAlbum(专辑);
}
Bundle extras=新Bundle();
额外的putParcelableArrayList(“歌曲”,歌曲);
记录发送(Activity.RESULT_OK,extras);
}
我希望能够做到的是“rec.send…”多次发送。这样我可以获得第一张专辑和第一首歌曲,然后将结果发送回媒体播放器,以便媒体播放器可以开始播放,然后在后台处理其余的内容,并在完成后添加。这意味着IntentService需要能够多次rec.send。这是可能的,还是我需要中断此into两个不同的IntentService调用,一个用于获取第一项,另一个用于获取其余项

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

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

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


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

很好。谢谢。我想把它作为一项异步任务来完成。我以前使用过它们,但我想IntentService将来也会允许我的应用程序更新,包括MediaScanner完成事件等。因此,当某些事情发生在我的应用程序之外时,我的应用程序也会自动更新。@IgnoredSaniTY:你提出的方案有可能更好地证明 ItnService < /C> >,但我仍然持怀疑态度。无论如何,你也可以让它与你所拥有的工作一起工作,如果你现在的方法变得过于复杂,你可以考虑沿途可能发生的变化。