У меня есть переработчик просмотров книг.Когда пользователь нажимает на книгу, запускается фрагмент с 2 кнопками, где пользователь может:
- Читать книгу
- Загрузить книгу
Еслипользователь хочет загрузить книгу, в верхней части фрагмента появляется индикатор выполнения с заголовком:
Downloading page <n> of <total pagecount>
Заголовок и индикатор выполнения обновляются до завершения загрузки.Пользователь может нажать кнопку «Назад» и загрузить другую книгу.Если пользователь решит вернуться к первой книге, фрагмент должен запуститься с текущим обновленным ходом загрузки.
Как лучше всего реализовать эту функцию?
Некоторые вещи, которые япопробовал:
- Я попытался создать AsyncTask во фрагменте.Но когда пользователь нажимает «назад», задача останавливается.
- Я создал интерфейс и позволил операции выполнить загрузку вместо фрагмента.Сейчас я могу сделать несколько загрузок, но у меня возникают проблемы с извлечением прогресса из действия и отображением его во фрагменте.Иногда индикатор выполнения и заголовок не обновляются вообще.Кроме того, мое приложение стало очень медленным и иногда перестало отвечать.
In Fragment:
fragmentCallback!!.downloadBook(activity, book, object : DownloadBookProgressCallback {
override fun downloadProgress(page: Int) {
uiThread {
progressBar!!.progress = page
progressText!!.text = "Downloading page " + page + " of " + book.content!!.pageCount!!
}
}
})
Интерфейсы:
interface FragmentCallback {
fun downloadBook(context: Context, book: ResourcesList, downloadBookProgressCallback: DownloadBookProgressCallback)
fun getDownloadProgress(bookId: Int):Int
fun getDownloadStatus (bookId: Int) : Boolean
fun getMaxPages (bookId: Int) : Int
}
В действии
override fun downloadBook(context: Context, book: ResourcesList, downloadBookProgressCallback: DownloadBookProgressCallback) {
val downloadInstance = DownloadBook()
activeDownloadBooks[book.id] = downloadInstance
downloadInstance.gettingPages(context, book.content!!.pageCount!!, book, downloadBookProgressCallback)
}
override fun getDownloadStatus(bookId: Int): Boolean {
val retrieveInstance = activeDownloadBooks[bookId]
if (retrieveInstance != null) {
return retrieveInstance.getDownloadStatus()
}
return false
}
override fun getDownloadProgress(bookId: Int): Int {
val retrieveInstance = activeDownloadBooks[bookId]
if (retrieveInstance!!.getDownloadStatus()) {
return retrieveInstance.getProgress()
} else {
}
return 0
}
override fun getMaxPages(bookId: Int): Int {
val retrieveInstance = activeDownloadBooks[bookId]
return retrieveInstance!!.getMaxPages()
}
Загрузить класс
class DownloadBook {
private var isDownloading : Boolean = false
private var currentPage = 0
private var maxPages = 0
var sp : SharedPreferences? = null
fun gettingPages(ctx : Context, pageCount : Int, book : ResourcesList, callback: DownloadBookProgressCallback) {
maxPages = pageCount
for (page in 1..pageCount) {
isDownloading = true
println("getting page " + page + " " + book.name)
currentPage = page
callback.downloadProgress(page)
var a = book.content!!.pageURI + page
println(a)
val bmap: Bitmap = Picasso.get().load(a).get()
val cw = ContextWrapper(ctx)
val directory = cw.getDir("BookId" + book.id.toString(), Context.MODE_PRIVATE)
val mypath = File(directory, "page" + page + ".jpg")
var fos: FileOutputStream
try {
fos = FileOutputStream(mypath)
bmap.compress(Bitmap.CompressFormat.PNG, 100, fos)
fos.close()
} catch (e: Exception) {
Log.e("DOWNLOAD_BOOK", e.message, e)
e.printStackTrace()
}
}
sp = PreferenceManager.getDefaultSharedPreferences(ctx)
val editor = sp!!.edit()
println("Saving to shared prefs: " + book.name)
editor.putString(book.id.toString(), book.content!!.pageCount.toString())
editor.apply()
isDownloading = false
}
fun getDownloadStatus() : Boolean {
return isDownloading
}
fun getProgress() : Int {
return currentPage
}
fun getMaxPages() : Int {
return maxPages
}
}
Во фрагменте: проверьте, есть литекущий загружаемый экземпляр
fragmentCallback = activity as FragmentCallback
if (fragmentCallback != null) {
doAsync {
var stillDownloading = fragmentCallback!!.getDownloadStatus(book_id)
var maxPages = 0
println("Stilldownloading: " + stillDownloading + " Book Id :" + book_id )
if (stillDownloading) {
uiThread {
progressBar!!.visibility = View.VISIBLE
progressText!!.visibility = View.VISIBLE
maxPages = fragmentCallback!!.getMaxPages(book_id)
progressBar!!.max = maxPages
ViewCompat.setBackgroundTintList(
dloadButton!!,
ColorStateList.valueOf(getColorWrapper(activity, R.color.color_grey)))
dloadButton!!.isEnabled = false
}
while (stillDownloading) {
var dloadPage = fragmentCallback!!.getDownloadProgress(book_id)
if (dloadPage > 0) {
uiThread {
progressBar!!.progress = dloadPage
progressText!!.text = "Downloading page " + dloadPage + " of " + maxPages
}
stillDownloading = fragmentCallback!!.getDownloadStatus(book_id)
}
}
}
}
}