#android #kotlin #unzip #socketexception #zipinputstream
Вопрос:
Я сталкиваюсь с исключением SocketException при распаковке файла, который получает с сервера. Я использовал ZipInputStream для извлечения файла из папки Zip, но я не знаю, почему я получаю исключение сокета. Согласно другому ответу на этот вопрос, я также попытался закрыть поток.
Фрагмент кода:
private fun getImageFromAPI(item: MetaDataEntity, action: (ImagesEntity) -> Unit) {
GlobalScope.launch(dispatcherProvider.io()) {
dataHandler.adminRequestHandler.getAdminZipImage(item.uuid) { responseZip: Response ->
val inputStream: InputStream = responseZip.body()!!.byteStream()
val zin = ZipInputStream(inputStream)
var ze: ZipEntry?
GlobalScope.launch(dispatcherProvider.io()) {
while (zin.nextEntry.also { ze = it } != null) { //in this line getting socket exception
ze?.let {
if (validateImageName(it.name)) {
val imageByteArray: ByteArray = zin.readBytes()
action(ImagesEntity(item.uuid, item.name, it.name.substring(0, 3), imageByteArray))
zin.closeEntry()
zin.close()
}
}
}
}
}
}
}
Журнал ошибок:
021-10-06 00:06:47.845 5903-6064/E/AndroidRuntime: FATAL EXCEPTION: DefaultDispatcher-worker-7
Process: PID: 5903
java.net.SocketException: Socket closed
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.socketRead(SocketInputStream.java:119)
at java.net.SocketInputStream.read(SocketInputStream.java:176)
at java.net.SocketInputStream.read(SocketInputStream.java:144)
at com.android.org.conscrypt.ConscryptEngineSocket$SSLInputStream.readFromSocket(ConscryptEngineSocket.java:936)
at com.android.org.conscrypt.ConscryptEngineSocket$SSLInputStream.processDataFromSocket(ConscryptEngineSocket.java:900)
at com.android.org.conscrypt.ConscryptEngineSocket$SSLInputStream.readUntilDataAvailable(ConscryptEngineSocket.java:815)
at com.android.org.conscrypt.ConscryptEngineSocket$SSLInputStream.read(ConscryptEngineSocket.java:788)
at okio.Okio$2.read(Okio.java:140)
at okio.AsyncTimeout$2.read(AsyncTimeout.java:237)
at okio.RealBufferedSource.read(RealBufferedSource.java:51)
at okhttp3.internal.http1.Http1Codec$AbstractSource.read(Http1Codec.java:363)
at okhttp3.internal.http1.Http1Codec$FixedLengthSource.read(Http1Codec.java:407)
at okio.RealBufferedSource$1.read(RealBufferedSource.java:447)
at java.io.FilterInputStream.read(FilterInputStream.java:133)
at java.io.PushbackInputStream.read(PushbackInputStream.java:186)
at java.util.zip.ZipInputStream.read(ZipInputStream.java:230)
at java.util.zip.ZipInputStream.closeEntry(ZipInputStream.java:147)
at java.util.zip.ZipInputStream.getNextEntry(ZipInputStream.java:120)
at de.iteratec.mywork.cache.repos.AdminRepo$getImageFromAPI$1$1$1.invokeSuspend(AdminRepo.kt:106)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106)
at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:571)
at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:738)
at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:678)
at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:665)
Пожалуйста, помогите мне разобраться, где я ошибаюсь. Любая помощь будет признательна.
Комментарии:
1. Происходит ли то же самое, если вы отделяете загрузку от распаковки? То есть, загрузите файл полностью, либо в память, либо в локальное хранилище, а затем распакуйте его?
2. @solarshado Я не пробовал этот вариант, например, сначала сохранить, а затем попытаться распаковать…позвольте мне попробовать ваше решение. Спасибо
3. @solarshado попробовал ваше предложение, но все равно получил ту же проблему