gpt4 book ai didi

java - 从 IntentService 多次发送结果

转载 作者:行者123 更新时间:2023-11-30 10:13:29 24 4
gpt4 key购买 nike

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

示例:有人点击了一位艺术家。这将使用 artist_id 启动 IntentService,然后 IntentService 开始执行其工作。我希望发生的是,IntentService 获取第一张专辑,然后是第一首歌曲并将结果发回,但它还会继续处理其余的专辑和歌曲,然后在完成后将它们全部发回.我不知道这是否有意义,所以这是我当前设置的示例...

基础 Activity ...

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 需要能够 rec.send 不止一次。这可能吗,或者我是否需要将其分成 2 个不同的 IntentService 调用,一个用于获取第一个项目,另一个用于获取其余项目?

最佳答案

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

为此您不需要 IntentService。一个普通的后台线程(可能绑定(bind)到 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() 通话)。

关于java - 从 IntentService 多次发送结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51333624/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com