在AsyncTask中使用kotlin初始化数据库

时间:2018-11-26 07:09:12

标签: android kotlin

在我的doInBackground中,我声明并初始化db时,出现错误,提示类型不匹配。我应该放什么而不是放this

var dbHelper: MyDBHelper? = null
dbHelper = MyDBHelper(this)

我应该放什么,在那里说Required: Context!

这是我的异步任务代码,dbHelper = MyDBHelper(this)处的问题。

private class UpgradeDB(textView: TextView?) : AsyncTask<String, String, String>() {
        var innerTextView: TextView? = textView

        override fun onPreExecute() {
            innerTextView!!.visibility = View.VISIBLE
        }

        override fun doInBackground(vararg params: String): String? {
            val filename = "eBOSSInv_Upgrade.sql"
            val sdcard = Environment.getExternalStorageDirectory()
            val file = File(sdcard, filename)

            if (!file.exists()) isCancelled

            try {
                var dbHelper: MyDBHelper? = null

                dbHelper = MyDBHelper(this)

                dbHelper!!.writableDatabase.use { db ->
                    var intTotalLine = 0
                    var intLine = 1
                    BufferedReader(FileReader(file)).useLines { _ -> intTotalLine++ }
                    BufferedReader(FileReader(file)).use { r ->
                        r.lineSequence().forEach {
                            if (it.isNotEmpty()) {
                                db!!.execSQL(it)
                                publishProgress(String.format("Updating %s/%s records", intLine, intTotalLine))
                                intLine++
                            }
                        }
                    }
                }
            } catch (e: Exception) {

            }
            return null
        }

        override fun onProgressUpdate(vararg text: String) {
            innerTextView!!.text = text[0]
        }

        override fun onPostExecute(result: String?) {
            innerTextView!!.text = ""
        }

        override fun onCancelled() {

        }
    }

2 个答案:

答案 0 :(得分:0)

这取决于您尝试在何处创建此对象。除非您在扩展Context的类中进行此操作(例如Activity),否则它不起作用。您可以尝试这样的构造:

您可以通过以下两种方式进行操作:

更简单的方法:将AsyncTask作为内部类声明为游览活动和使用label的引用上下文中的内部类。要将类声明为内部类,您需要将其放置在另一个类中,并添加 inner keyowrd:

class A {

    inner class B

}

现在,您可以像这样从异步任务内部引用上下文:

dbHelper = DbHelper([ActivityName]@this)

尽管如此,这是导致内存泄漏的简单方法,您可以在此处阅读更多内容:Android AsyncTask memory leaks

更好的方法是将AsyncTask提取到另一个类,并将应用程序上下文而不是Activity传递给它。

答案 1 :(得分:0)

您需要将context传递到Async Task中。

示例:

llUpdate.setOnClickListener { 
       UpgradeDB(txtUpdate!!, getApplication()).execute("", "", "") 
}

然后在UpgradeDB中初始化上下文。

private class UpgradeDB(textView: TextView?, context: Context) : AsyncTask<String, String, String>() {
        var innerTextView: TextView? = textView
        var mContext:Context? = context // initialize context
    }

最后

dbHelper = MyDBHelper(mContext)