Пример загрузки файла расширения не показывает полный прогресс
В настоящее время я готовлю демо для включения файла расширения в разработанный проект. Я следовал этому уроку.
После большой борьбы я могу запустить демонстрационное приложение, но у меня возникают проблемы с отображением прогресса для загруженных данных.
Я загрузил файл obb в магазин воспроизведения, который составляет 1 060 024 байта, а на диске - 1 060 864 байта.
Ниже приведен фрагмент кода, где, я думаю, может быть проблема.
private static final XAPKFile[] xAPKS = { new XAPKFile(true,6,1060024L) };
void validateXAPKZipFiles() {
AsyncTask<Object, DownloadProgressInfo, Boolean> validationTask = new AsyncTask<Object, DownloadProgressInfo, Boolean>() {
@Override
protected void onPreExecute() {
mDashboard.setVisibility(View.VISIBLE);
mCellMessage.setVisibility(View.GONE);
mStatusText.setText(R.string.text_verifying_download);
mPauseButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mCancelValidation = true;
}
});
mPauseButton.setText(R.string.text_button_cancel_verify);
super.onPreExecute();
}
@Override
protected Boolean doInBackground(Object... params) {
for (XAPKFile xf : xAPKS) {
String fileName = Helpers.getExpansionAPKFileName(
MainActivity.this, xf.mIsMain, xf.mFileVersion);
if (!Helpers.doesFileExist(MainActivity.this, fileName,
xf.mFileSize, true)) {
return false;
}
fileName = Helpers.generateSaveFileName(MainActivity.this,
fileName);
ZipResourceFile zrf;
byte[] buf = new byte[1024 * 256];
try {
zrf = new ZipResourceFile(fileName);
ZipEntryRO[] entries = zrf.getAllEntries();
/**
* First calculate the total compressed length
*/
long totalCompressedLength = 0;
for (ZipEntryRO entry : entries) {
totalCompressedLength += entry.mCompressedLength;
}
float averageVerifySpeed = 0;
long totalBytesRemaining = totalCompressedLength;
long timeRemaining;
/**
* Then calculate a CRC for every file in the Zip file,
* comparing it to what is stored in the Zip directory.
* Note that for compressed Zip files we must extract
* the contents to do this comparison.
*/
for (ZipEntryRO entry : entries) {
if (-1 != entry.mCRC32) {
long length = entry.mUncompressedLength;
CRC32 crc = new CRC32();
DataInputStream dis = null;
try {
dis = new DataInputStream(
zrf.getInputStream(entry.mFileName));
long startTime = SystemClock.uptimeMillis();
while (length > 0) {
int seek = (int) (length > buf.length ? buf.length
: length);
dis.readFully(buf, 0, seek);
crc.update(buf, 0, seek);
length -= seek;
long currentTime = SystemClock
.uptimeMillis();
long timePassed = currentTime
- startTime;
if (timePassed > 0) {
float currentSpeedSample = (float) seek
/ (float) timePassed;
if (0 != averageVerifySpeed) {
averageVerifySpeed = SMOOTHING_FACTOR
* currentSpeedSample
+ (1 - SMOOTHING_FACTOR)
* averageVerifySpeed;
} else {
averageVerifySpeed = currentSpeedSample;
}
totalBytesRemaining -= seek;
timeRemaining = (long) (totalBytesRemaining / averageVerifySpeed);
Log.e("Remaining Size is :: ",
" "
+ (totalCompressedLength - totalBytesRemaining));
this.publishProgress(new DownloadProgressInfo(
totalCompressedLength,
totalCompressedLength
- totalBytesRemaining,
timeRemaining,
averageVerifySpeed));
}
startTime = currentTime;
if (mCancelValidation)
return true;
}
if (crc.getValue() != entry.mCRC32) {
Log.e(Constants.TAG,
"CRC does not match for entry: "
+ entry.mFileName);
Log.e(Constants.TAG, "In file: "
+ entry.getZipFileName());
return false;
}
} finally {
if (null != dis) {
dis.close();
}
}
}
}
} catch (IOException e) {
e.printStackTrace();
return false;
}
}
return true;
}
@Override
protected void onProgressUpdate(DownloadProgressInfo... values) {
onDownloadProgress(values[0]);
super.onProgressUpdate(values);
}
@Override
protected void onPostExecute(Boolean result) {
if (result) {
mDashboard.setVisibility(View.VISIBLE);
mCellMessage.setVisibility(View.GONE);
mStatusText.setText(R.string.text_validation_complete);
mPauseButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
finish();
}
});
mPauseButton.setText(android.R.string.ok);
} else {
mDashboard.setVisibility(View.VISIBLE);
mCellMessage.setVisibility(View.GONE);
mStatusText.setText(R.string.text_validation_failed);
mPauseButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
finish();
}
});
mPauseButton.setText(android.R.string.cancel);
}
super.onPostExecute(result);
}
};
validationTask.execute(new Object());
}
Я не использую файл патча, использую только основной файл.
Каждый раз, когда я загружаю данные, он показывает случайный прогресс, как показано ниже
И на самом деле его загрузка полных данных, но не может проверить полные данные. Следующие записи logcat при печати оставшихся байтов для проверки.
11-08 12: 22: 12.205: E / оставшийся размер::(20326): 46804 11-08 12:22:13.370: E/ оставшийся размер::(20326): 99054 11-08 12:22:13.460: E/ Оставшийся размер::(20326): 203827 11-08 12:22:14.035: E/ Оставшийся размер::(20326): 465971 11-08 12:22:14.115: E/ Оставшийся размер:::(20326): 728115 11-08 12:22:14.155: E/ оставшийся размер::(20326): 813899 11-08 12:22:14.270: E/ оставшийся размер::(20326): 850970 11-08 12:22:14.295: E/ оставшийся размер::(20326): 868781 11-08 12:22:14.320: E/ оставшийся размер::(20326): 1041595
Я не могу определить проблему, если кто-то сталкивается с проблемой, это было бы очень полезно.
Заранее спасибо.
1 ответ
Проблема здесь в том, что общий размер вычисляется для записей в архивном файле, что приводит к несжатому размеру файлов в архивном файле. И прогресс отображается на основе того же.
Первое решение заключается в том, что для проверки доступности файла расширения сохраняйте проверку в том виде, в каком она есть в вашем приложении, но для расчета укажите исходный размер. Расчеты выполняются для заархивированных записей в библиотеке zip-файлов, при необходимости измените их соответствующим образом. (Я не пробовал это решение.)
Во-вторых, сжимайте файлы так, чтобы файлы внутри папки были несжатыми. В этом случае вам нечего будет делать, но недостатком будет то, что пользователь должен будет загрузить файл немного большего размера.