Несколько загрузок и обновление индикатора выполнения для каждого - PullRequest
0 голосов
/ 25 июня 2018

У меня есть переработчик просмотров книг.Когда пользователь нажимает на книгу, запускается фрагмент с 2 кнопками, где пользователь может:

  1. Читать книгу
  2. Загрузить книгу

Еслипользователь хочет загрузить книгу, в верхней части фрагмента появляется индикатор выполнения с заголовком:

Downloading page <n> of <total pagecount>

Заголовок и индикатор выполнения обновляются до завершения загрузки.Пользователь может нажать кнопку «Назад» и загрузить другую книгу.Если пользователь решит вернуться к первой книге, фрагмент должен запуститься с текущим обновленным ходом загрузки.

Как лучше всего реализовать эту функцию?

Некоторые вещи, которые япопробовал:

  1. Я попытался создать AsyncTask во фрагменте.Но когда пользователь нажимает «назад», задача останавливается.
  2. Я создал интерфейс и позволил операции выполнить загрузку вместо фрагмента.Сейчас я могу сделать несколько загрузок, но у меня возникают проблемы с извлечением прогресса из действия и отображением его во фрагменте.Иногда индикатор выполнения и заголовок не обновляются вообще.Кроме того, мое приложение стало очень медленным и иногда перестало отвечать.

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)

                            }
                        }

                }
            }

        }
...