我当前的项目正在从服务器下载数据,我想显示一个进度条,以便用户知道发生了什么。我有一个简单的警报对话框,我试图在为用户加载json数据时添加警报对话框。当我启动应用程序时,即使数据已经加载并且没有隐藏,警报对话框仍然停留在屏幕上。
AsyncTask代码:
inner class Arr : AsyncTask<String, String, String>(){
val progressDialog = AlertDialog.Builder(this@MainActivity)
val dialogView = layoutInflater.inflate(R.layout.progress_dialog,null)
val message = dialogView.findViewById<TextView>(R.id.message_id)
val dialog = progressDialog.create()
override fun onPreExecute() {
super.onPreExecute()
progressDialog.setMessage("loading")
progressDialog.setCancelable(false)
progressDialog.show()
}
// for build connection
override fun doInBackground(vararg url: String?): String{
var text : String
val connection = URL(url[0]).openConnection() as HttpURLConnection
try {
connection.connect()
text = connection.inputStream.use { it.reader().use{reader -> reader.readText()} }
} finally{
connection.disconnect()
}
return text
}
override fun onPostExecute(result: String?) {
super.onPostExecute(result)
handleJson(result)
dialog.dismiss()
}
override fun onProgressUpdate(vararg text: String?) {
dialog.dismiss()
}
private fun handleJson (jsonString: String?){
dialog.dismiss()
val jsonObj = JSONObject(jsonString)
val result = jsonObj.getJSONObject("result")
val response = result.getJSONObject("response")
val airport = response.getJSONObject("airport")
val pluginData = airport.getJSONObject("pluginData")
val schedule = pluginData.getJSONObject("schedule")
val arrivals = schedule.getJSONObject("arrivals")
// val data = arrivals.getJSONObject("data")
val jsonArray = JSONArray(arrivals.get("data").toString())
val list = ArrayList<FlightShdu>()
var x = 0
while (x < jsonArray.length()){
val jsonObject = jsonArray.getJSONObject(x)
list.add(FlightShdu(
jsonObject.getJSONObject("flight").getJSONObject("identification").getJSONObject("number").getString("default"),
jsonObject.getJSONObject("flight").getJSONObject("airline").getString("name"),
jsonObject.getJSONObject("flight").getJSONObject("status").getString("text"),
jsonObject.getJSONObject("flight").getJSONObject("airline").getJSONObject("code").getString("icao"),
jsonObject.getJSONObject("flight").getJSONObject("time").getJSONObject("scheduled").getString("arrival")
))
x++
}
list.forEach(::println)
val adapter = ListAdapte(this@MainActivity,list)
flight_arrivel_list.adapter = adapter
}
} //
有什么解决办法吗?
答案 0 :(得分:1)
更改为此:
override fun onPreExecute() {
super.onPreExecute()
dialog.setMessage("loading")
dialog.setCancelable(false)
dialog.show()
}
并使用以下代码将其隐藏:
dialog.dismiss();
您必须引用AlertDialog
对象,而不是AlertDialog.Builder
。
答案 1 :(得分:0)
在您的onPreExecute()
override fun onPreExecute() {
...
progressDialog.show()
}
但是在onPostExecute()
中,您调用了另一个对话框来关闭
override fun onPostExecute(result: String?) {
...
dialog.dismiss()
}
因此您需要在progressDialog.dismiss()
中致电onPostExecute()
。
答案 2 :(得分:0)
progressDialog.dismiss()
而不是dialog.dismiss()