代码之家  ›  专栏  ›  技术社区  ›  Neglected Sanity

从intentservice多次发送结果

  •  2
  • Neglected Sanity  · 技术社区  · 6 年前

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

    获取播放列表项服务…

    @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将需要能够记录发送不止一次。这可能吗?或者我需要将它分成两个不同的intentservice调用,一个获取第一个项,另一个获取其余项?

    1 回复  |  直到 6 年前
        1
  •  1
  •   CommonsWare    6 年前

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

    你不需要 IntentService 为了这个。普通的背景线(可能与 LiveData )我是说, AsyncTask ,rxjava链等可以处理这个问题。

    这意味着intentservice将需要能够记录发送不止一次。有可能吗

    当然。使用普通的后台线程会更有效, 异步任务 ,rxjava链等等,但是,您应该能够 send() 你喜欢多少次就多少次。结果会交给 onReceiveResult() 一次一个(即,你打电话给 Sead() 6次,你得到6 OnReceiveResult() 电话)。