Add simple caching when downloading image
This commit is contained in:
parent
db5e7056e6
commit
1e4b5f0476
|
@ -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()
|
||||
|
|
|
@ -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
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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)
|
||||
|
|
|
@ -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()
|
||||
|
|
Loading…
Reference in New Issue