Ответ 1
DownloadService загружается во временное место назначения по умолчанию. Не существует встроенной возможности кэширования запросов, однако вы можете запросить список загрузок, запрошенных ранее, с помощью DownloadManager.query().
Я хочу повторить запросы для URL-адреса, который будет обслуживаться из локального кеша, а не повторно загружаться с сервера. Я использую DownloadManager, надеясь, что это будет удобная альтернатива HttpURLConnection
(видел, что он рекомендовал), но по умолчанию не кэшируется ответ. Здесь мой тестовый код:
final Context context = getContext();
final DownloadManager manager =
Android.ensureSystemService( DownloadManager.class, context );
final DownloadManager.Request req =
new DownloadManager.Request( Uri.parse( BIG_FILE_URL ));
req.setNotificationVisibility( VISIBILITY_HIDDEN ); // hiding from user
context.registerReceiver( new BroadcastReceiver()
{
public void onReceive( final Context context, final Intent intent )
{
context.unregisterReceiver( this ); // one shot for this test
final long id = intent.getLongExtra( EXTRA_DOWNLOAD_ID, -1L );
System.err.println( " --- downloaded id=" + id );
System.err.println( " --- uri=" +
manager.getUriForDownloadedFile(id) );
}
}, new IntentFilter( ACTION_DOWNLOAD_COMPLETE ));
manager.enqueue( req );
Выполняя вышеуказанный тест дважды, я вижу два запроса GET
на удаленном сервере (каждый с ответом 200
) и следующие в локальном журнале Android:
20:14:27.574 D/DownloadManager( 1591): [1] Starting
20:14:28.256 D/DownloadManager( 1591): [1] Finished with status SUCCESS
20:14:28.263 W/System.err( 2203): --- downloaded id=1
20:14:28.269 W/System.err( 2203): --- uri=content://downloads/my_downloads/1
20:15:13.904 D/DownloadManager( 1591): [2] Starting
20:15:14.517 D/DownloadManager( 1591): [2] Finished with status SUCCESS
20:15:14.537 W/System.err( 2203): --- downloaded id=2
20:15:14.541 W/System.err( 2203): --- uri=content://downloads/my_downloads/2
Итак, он дважды загрузил BIG_FILE
и сохранил его в двух файлах. Вместо этого я хочу кэширование ответа. Может ли DownloadManager
выполнить кэширование ответа?
PS. Похоже, что нет. Поэтому я исправил рекомендацию, которая привела меня сюда (см. Rev 22).
ПФС. Разумеется, я протестировал стандартный HttpResponseCache. Он не влияет на DownloadManager
, хотя он позволяет кэшировать по умолчанию для каждого HttpURLConnection
.
DownloadService загружается во временное место назначения по умолчанию. Не существует встроенной возможности кэширования запросов, однако вы можете запросить список загрузок, запрошенных ранее, с помощью DownloadManager.query().