在我的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() {
}
}
答案 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)