【发布时间】:2017-10-19 18:20:24
【问题描述】:
这个 AsyncTask 类应该是静态的,否则可能会发生泄漏
为什么我的 AsyncTask 不起作用?
致电:PlacesTask(this).execute(...)
代码:
private class PlacesTask internal constructor(activity: MainActivity) : AsyncTask<String, Int, String>() {
var data: String? = null
private val mRef: WeakReference<MainActivity> = WeakReference(activity)
override fun doInBackground(vararg url: String): String? {
try {
data = MainActivity().downloadUrl(url[0])
} catch (e: Exception) {
Log.d("Background Task", e.toString())
}
return data
}
override fun onPostExecute(result: String) {
val asyncTaskLeak = mRef.get()
if (asyncTaskLeak != null) SetPlaceTask().execute(result)
}
}
private class SetPlaceTask : AsyncTask<String, Int, List<HashMap<String, String>>>() {
var places: List<HashMap<String, String>>? = null
override fun doInBackground(vararg jsonData: String): List<HashMap<String, String>>? {
try {
places = PlaceJSONParser().parse(JSONObject(jsonData[0]))
} catch (e: Exception) {
Log.d("Exception", e.toString())
}
return places
}
override fun onPostExecute(list: List<HashMap<String, String>>) {
...
}
}
@Throws(IOException::class)
private fun downloadUrl(strUrl: String): String {
var data = ""
var iStream: InputStream? = null
var urlConnection: HttpURLConnection? = null
try {
urlConnection = URL(strUrl).openConnection() as HttpURLConnection
urlConnection.connect()
iStream = urlConnection.inputStream
val br = BufferedReader(InputStreamReader(iStream!!))
val sb = StringBuilder()
var line: String? = null
while ({line = br.readLine(); line }() != null) sb.append(line)
data = sb.toString()
br.close()
} catch (e: Exception) {
Log.d("downloading url", e.toString())
} finally {
if (iStream != null) iStream.close()
if (urlConnection != null) urlConnection.disconnect()
}
return data
}
错误:java.lang.IllegalArgumentException:参数指定为 非空为空:方法 kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull,参数 结果
请帮忙。我错过了什么?
【问题讨论】:
标签: android memory-leaks android-asynctask kotlin