Kotlin Android - Update UI from AsyncTask in Fragment



我有一个带有AsyncTask()的片段。 这AsyncTask()SharedPreferences加载数据,然后将它们放入ArrayAdapter

问题是,这个ArrayAdapter应该用于ListView,但是从AsyncTask()类中我无法与UI交互,因为我应该使用LayoutInflower来执行此操作,并且我的膨胀布局是从函数OnCreateView返回的,所以我无法将其传递给AsyncTask()

我尝试将布局直接膨胀到AsyncTask()并且可以工作,但我无法单击ListView项目。

也尝试过

if(AsyncTask.status == Status.FINISHED){
//my code
}

但什么也没发生。

这是我的OnCreateView()

override fun onCreateView(

inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val mainView = inflater.inflate(R.layout.fragment_email, container, false)
MyAsyncTask().execute()
if(MyAsyncTask().status == Status.FINISHED){
mainView.email_listView.adapter = adapter
adapter.notifyDataSetChanged()
if(adapter.isEmpty)
mainView.email_blank_textView.text = resources.getString(R.string.noEmail)
mainView.email_listView.setOnItemClickListener { adapterView, _, i,  l ->
viewEmailAlertDialog(adapterView, i, adapter)
}
}

这是我AsyncTask()

inner class MyAsyncTask : AsyncTask<Unit, Unit, String>(){
override fun doInBackground(vararg params: Unit): String {
loadData()
loadDataCount()
return "FINISHED"
}
override fun onPostExecute(result: String) {
if(AppCompatDelegate.getDefaultNightMode() == AppCompatDelegate.MODE_NIGHT_YES)
adapter = ArrayAdapter(activity!!.applicationContext, R.layout.listview_text_dark, emailAddresses)
else
adapter = ArrayAdapter(activity!!.applicationContext, R.layout.listview_text_light, emailAddresses)
adapter.notifyDataSetChanged()
}
}

return mainView
}

您在执行异步后立即调用if(MyAsyncTask().status == Status.FINISHED),而异步甚至可能尚未开始工作,

您可以在 oncreate 中将空列表提供给适配器,并将 setonclicklistener 提供给列表视图(删除异步 == 完成的逻辑(,然后只需更新该列表并调用适配器.notifyDataSetChanged 在执行后,

但是,我确实同意@Pawel您使用协程的观点,请参阅我的问题:

Kotlin 协程

最新更新