具有<Generics>的AsyncTask-java.lang.Object []无法转换为java.lang.String []

时间:2019-07-10 08:05:00

标签: java android kotlin android-asynctask background

我正在尝试使用一些API链接。因此,为了做到这一点,我使用泛型为应用程序中的每个操作创建了一个基础AsyncTask和基类SOURCERESULT

问题是当我尝试初始化一个子类时,它返回一个ClassCastException错误。

这是基本的异步类

abstract class MvpBackgroundInteraction<SOURCE, RESULT> : AsyncTask<SOURCE, Int, RESULT?>(), MvpFeedContract.MvpFeedInteraction<SOURCE, RESULT> {

protected var isWorking: Boolean = true
protected var completeListener : MvpFeedContract.MvpCompleteListener<RESULT>? = null

override fun start(source: SOURCE) {
    super.execute(source)
}

override fun stop() {
    isWorking = false
}


override fun addCompleteListener(completeListener: MvpFeedContract.MvpCompleteListener<RESULT>?) {
    this.completeListener = completeListener
}

override fun onPostExecute(result: RESULT?) {
    completeListener?.apply {
        if (result != null) onComplete(result) else onFailure("Result is null")
    }
    super.onPostExecute(result)
}

}

此处是MvpFeedContract

interface MvpFeedContract {

interface MvpFeedInteraction<SOURCE, RESULT> {
    fun start(source : SOURCE)
    fun stop()
    fun addCompleteListener(completeListener: MvpCompleteListener<RESULT>?)
}

interface MvpCompleteListener<RESULT> {
    fun onComplete(result : RESULT)
    fun onFailure(message : String?)
}
}

这是返回该错误的子类之一

class MvpDownloader : MvpBackgroundInteraction<String, InputStream>() {

override fun doInBackground(vararg p0: String): InputStream? {
    return try {
        if (isWorking) downloadUrl(p0[0]) else null
    } catch (e : Exception) {
        Log.e("MvpParser", e.message ?: "error")
        null
    }
}

companion object {
    @Throws(IOException::class)
    private fun downloadUrl(urlString: String): InputStream? {
        val url = URL(urlString)
        return (url.openConnection() as? HttpURLConnection)?.run {
            readTimeout = 10000
            connectTimeout = 15000
            requestMethod = "GET"
            doInput = true
            connect()
            inputStream
        }
    }
}
}

这是我如何初始化它以及一些类似的类

private val downloader : MvpDownloader by lazy { MvpDownloader() }
private val parser : MvpParser<OBJECT> by lazy { MvpParser<OBJECT>() }
private val cashier : MvpCashier<OBJECT> by lazy { MvpCashier<OBJECT>(baseDao) }

这是返回的日志

2019-07-10 14:55:11.962 1708-1729/com.tamimattafi.degitalnomads E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1
Process: com.tamimattafi.degitalnomads, PID: 1708
java.lang.RuntimeException: An error occurred while executing doInBackground()
    at android.os.AsyncTask$3.done(AsyncTask.java:330)
    at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354)
    at java.util.concurrent.FutureTask.setException(FutureTask.java:223)
    at java.util.concurrent.FutureTask.run(FutureTask.java:242)
    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:255)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
    at java.lang.Thread.run(Thread.java:776)
 Caused by: java.lang.ClassCastException: java.lang.Object[] cannot be cast to java.lang.String[]
    at com.tamimattafi.degitalnomads.repository.feed.MvpDownloader.doInBackground(MvpDownloader.kt:10)
    at android.os.AsyncTask$2.call(AsyncTask.java:316)
    at java.util.concurrent.FutureTask.run(FutureTask.java:237)
    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:255) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607) 
    at java.lang.Thread.run(Thread.java:776) 

编辑 这是我的供稿经理

class FeedManager<OBJECT>(baseDao: BaseDao<OBJECT>) : MvpFeedContract.MvpFeedInteraction<String, Boolean> {

private var isWorking = true
private var completeListener: MvpFeedContract.MvpCompleteListener<Boolean>? = null

private val downloader : MvpDownloader by lazy { MvpDownloader() }
private val parser : MvpParser<OBJECT> by lazy { MvpParser<OBJECT>() }
private val cashier : MvpCashier<OBJECT> by lazy { MvpCashier<OBJECT>(baseDao) }

override fun start(source: String) {
    downloadFeed(source)
}

private fun downloadFeed(link : String) {
    downloader.apply {
        addCompleteListener(object :
            MvpFeedContract.MvpCompleteListener<InputStream> {
            override fun onComplete(result: InputStream) {
                parseFeed(result)
            }

            override fun onFailure(message: String?) {
                completeListener?.onFailure(message)
            }

        })
        start(link)
    }
}

private fun parseFeed(result: InputStream) {
    parser.apply {
        addCompleteListener(object :
            MvpFeedContract.MvpCompleteListener<List<OBJECT>> {
            override fun onComplete(result: List<OBJECT>) {
                cashFeed(result)
            }

            override fun onFailure(message: String?) {
                completeListener?.onFailure(message)
            }

        })
        start(result)
    }
}

private fun cashFeed(result: List<OBJECT>) {
    cashier.apply {
        addCompleteListener(object :
            MvpFeedContract.MvpCompleteListener<Boolean> {
            override fun onComplete(result: Boolean) {
                completeListener?.onComplete(result)
            }

            override fun onFailure(message: String?) {
                completeListener?.onFailure(message)
            }

        })
        start(result)
    }
}


override fun stop() {
    isWorking = false
    downloader.stop()
    parser.stop()
    cashier.stop()
}

override fun addCompleteListener(completeListener: MvpFeedContract.MvpCompleteListener<Boolean>?) {
    this.completeListener = completeListener
}


}

0 个答案:

没有答案