我是android的新手,我经历了很多论坛和讨论,但我仍然对从服务器上下载大文件应该用什么感到困惑!
在我们的应用程序中,我们在应用程序前端的播放列表中播放多个视频,同时我们调用API服务来获取播放列表中的列表视频,我们在asynctask中调用API并且onpostexecute方法解析API响应并排队任何要在downloadmanger中下载的新文件。
关注点
公共类MediaAsyncTask扩展了AsyncTask> {
@Override
protected List<Media> doInBackground(String... params) {
List<Media> result = new ArrayList<Media>();
try {
ResponseHandler responseHandlerObj = new ResponseHandler(getApplicationContext());
result = responseHandlerObj.deviceMedia(device_id);
media_status = responseHandlerObj.getResponse_status();
media_msg = responseHandlerObj.getResponse_msg();
media_version = responseHandlerObj.getMedia_version();
medias_total = responseHandlerObj.getMedias_total();
} catch (Exception e) {
Log.d(TAG, e.getLocalizedMessage());
e.printStackTrace();
}
return result;
}
@Override
protected void onPostExecute(List<Media> result) {
Log.e(TAG, "status " + media_status);
if (media_status.equals(STATUS_SUCCESS)) {
Log.d(TAG, media_msg);
if (device_path != null) {
int _total_downloaded = databaseHandler.getDownloadedMediaCount(device_id);
int _total_in_api = medias_total;
int _downloaded_version = preferenceHelper.getDeviceMediaVersion(device_id);
Log.d(TAG, "media_version : " + media_version + " _downloaded_version : " + _downloaded_version + " _total_downloaded : " + _total_downloaded + " _total_in_api : " + _total_in_api);
//remove true after testing
if (media_version != _downloaded_version || _total_downloaded != _total_in_api) {
databaseHandler.deleteAllDeviceMedias(device_id);
int id;
String file;
for (Media media : result) {
id = 0;
file = media.getFile();
String file_url = media.getFile_url();
Log.d(TAG, "media file exists: " + fileManager.checkFileExists(device_path, file));
if (file != null && !fileManager.checkFileExists(device_path, file) && URLUtil.isValidUrl(file_url)) {
media.setDownloaded(0);
id = databaseHandler.saveMedia(media);
queueDownload(file_url, file);
} else if (fileManager.checkFileExists(device_path, file)) {
long app_size = (int) fileManager.getFileSize(device_path + "/" + file);
long server_size = media.getFile_size();
long server_size_minus = server_size - 100;
if (app_size < server_size_minus) {
fileManager.deleteFile(device_path + "/" + file);
queueDownload(file_url, file);
} else {
id = saveDownloadedResource(media);
}
}
}
}
if (download_files.size() == 0) {
Log.d(TAG, "nothing to download");
preferenceHelper.setDeviceMediaVersion(device_id, media_version);
}
}
} else {
Log.e(TAG, "Media: Failed to fetch data!");
}
}
private int saveDownloadedResource(Media media) {
int id = 0;
media.setDownloaded(1);
id = databaseHandler.saveMedia(media);
initUpdateLayoutOnNewResource();
return id;
}
}