Add simple caching when downloading image

This commit is contained in:
oupson 2018-10-25 10:20:30 +02:00
parent db5e7056e6
commit 1e4b5f0476
4 changed files with 39 additions and 27 deletions

View File

@ -1,5 +1,6 @@
package oupson.apng
import android.content.Context
import android.graphics.*
import android.graphics.drawable.AnimationDrawable
import android.os.Environment
@ -13,7 +14,7 @@ import java.io.IOException
import java.net.URL
class ApngAnimator {
class ApngAnimator(val context: Context) {
var isPlaying = true
private set(value) {field = value}
@ -32,13 +33,11 @@ class ApngAnimator {
var background : Bitmap? = null
val imageView : ImageView?
var imageView : ImageView? = null
constructor() {
imageView = null
}
constructor(imageView : ImageView) {
fun loadInto(imageView: ImageView) : ApngAnimator {
this.imageView = imageView
return this
}
/**
@ -102,7 +101,7 @@ class ApngAnimator {
private fun loadUrl(url : URL) {
doAsync(exceptionHandler = {e -> throw e}) {
// Download PNG
val extractedFrame = APNGDisassembler(Loader().load(url)).pngList
val extractedFrame = APNGDisassembler(Loader().load(context!!, url)).pngList
// Set last frame
lastFrame = extractedFrame[0]
@ -221,7 +220,7 @@ class ApngAnimator {
counter = 0
}
val delay = Frames[counter].delay
imageView.setImageBitmap(generatedFrame[counter])
imageView?.setImageBitmap(generatedFrame[counter])
counter++
myHandler.postDelayed({
ifmustPlay()

View File

@ -1,28 +1,40 @@
package oupson.apng
import android.content.Context
import android.util.Log
import java.io.BufferedInputStream
import java.io.ByteArrayOutputStream
import java.io.File
import java.io.IOException
import java.net.URL
class Loader {
fun load(url : URL) : ByteArray {
try {
val connection = url.openConnection()
connection.connect()
val input = BufferedInputStream(connection.getInputStream())
val output = ByteArrayOutputStream()
val data = ByteArray(1024)
var count = 0
while ({count = input.read(data); count}() != -1) {
output.write(data, 0, count)
fun load( context: Context, url : URL) : ByteArray {
val currenDir = context.filesDir
val fileTXT = File(currenDir, "apngLoader.txt")
var filePNG = File(currenDir, "apngLoader.png")
if (fileTXT.exists() && url.toString() == fileTXT.readText()) {
return filePNG.readBytes()
} else {
try {
val connection = url.openConnection()
connection.connect()
val input = BufferedInputStream(connection.getInputStream())
val output = ByteArrayOutputStream()
val data = ByteArray(1024)
var count = 0
while ({ count = input.read(data); count }() != -1) {
output.write(data, 0, count)
}
output.flush()
output.close()
input.close()
fileTXT.writeText(url.toString())
filePNG.writeBytes(output.toByteArray())
return output.toByteArray()
} catch (e: IOException) {
throw e
}
output.flush()
output.close()
input.close()
return output.toByteArray()
} catch (e: IOException) {
throw e
}
}
}

View File

@ -6,6 +6,7 @@ import android.os.Bundle
import android.provider.MediaStore
import android.support.v7.app.AppCompatActivity
import android.util.Log
import kotlinx.android.synthetic.main.activity_main.*
import kotlinx.android.synthetic.main.activity_main2.*
import org.jetbrains.anko.sdk27.coroutines.onClick
import oupson.apng.ApngAnimator
@ -20,7 +21,7 @@ class Main2Activity : AppCompatActivity() {
override fun onResume() {
super.onResume()
val animator = ApngAnimator(imageView3)
val animator = ApngAnimator(this).loadInto(imageView2)
val uri = intent.data
if (uri.toString().contains("file:///")) {
animator.load(uri.path)

View File

@ -37,10 +37,10 @@ class MainActivity : AppCompatActivity() {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
animator = ApngAnimator(imageView)
animator = ApngAnimator(this).loadInto(imageView)
animator.load(imageUrl)
Picasso.get().load(imageUrl).into(imageView2);
Picasso.get().load(imageUrl).into(imageView2)
play.setOnClickListener {
animator.play()