Retrofit 2 @Streaming冻结应用程序

时间:2016-09-12 09:12:00

标签: android service retrofit2 intentservice

我有一个IntentService代表下载队列中的一个任务。我收到了要从Intent onHandleIntent(Intent)方法下载的数据。 我正在使用改装2进行下载。在我的应用中,您有更大的媒体文件。出于这个原因,我想使用@Streaming注释。当我这样做时,应用程序会冻结,直到下载完成。我试图将代码包装在Thread中,但它没有帮助。当我不使用@Streaming时,我可以在下载过程中浏览应用程序。然而,由于ResponseBody很大,这会占用大量内存。

@Streaming
@GET
Call<ResponseBody> downloadMediaFile(@Url String directDownload);

服务:

@Override
protected void onHandleIntent(Intent intent) {
    if(intent != null && intent.hasExtra(DownloadManager.EXTRA_MEDIA)){
        final Media media = intent.getParcelableExtra(DownloadManager.EXTRA_MEDIA);

        FeedService feedService = ApiServices.get().getFeedService();
        String url = media.getDirectDownload();
        Call<ResponseBody> call = feedService.downloadMediaFile(url);
        call.enqueue(new Callback<ResponseBody>() {
            @Override
            public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
                File resultFile = response.isSuccessful() ? writeResponse(response.body(), media) : null;
                LogUtils.LOGD(TAG, resultFile != null ? "Download successful" : "Download unsuccessful");

                if(resultFile != null){
                    EventBus.getDefault().post(new MediaDownloadComplete(media, resultFile));
                } else {
                    onFailure(call, new NullPointerException("No result file received"));
                }

                if(DownloadManager.get() != null){
                    DownloadManager.get().nextInQueue();
                }

                media.setInProgress(false);
                stopSelf();
            }

            @Override
            public void onFailure(Call<ResponseBody> call, Throwable t) {
                media.setInProgress(false);
                stopSelf();
            }
        });
    }
}

DownloadManagerService,用于处理下载队列。

0 个答案:

没有答案