我不确定我在这里做错了什么,但我的主线程被阻止了(根据Android工作室的消息:I/Choreographer:跳过了1009帧!应用程序可能在其主线程上做了太多工作。(尽管我使用一个单独的线程来使用itext创建PDF。
+
我的微调器类,我的toast也没有显示,两者都是在主线程中编写的(可能是因为主线程根据消息没有响应(。创建PDF后,对话框会正常显示,一切都会按预期开始工作。
val bmap = BitmapFactory.decodeResource(this@SiteItemsActivity.resources,R.drawable.camera_item_center)
val threadPDF = Thread(object : Runnable {
override fun run() {
CreatePDF(file, site, bmap).makePDF()
}
})
threadPDF.start()
spinner.setVisibility(View.VISIBLE)
Toast.makeText(this@SiteItemsActivity,"Please wait....",Toast.LENGTH_SHORT).show()
while (threadPDF.isAlive){
//Thread.sleep(1)
}
spinner.setVisibility(View.GONE);
showDialog()
尽管我使用单独的线程使用itext 创建PDF
但是,您正在用一个连续循环(while (threadPDF.isAlive)
(绑定主应用程序线程。
删除那个while
循环。工作完成后,使用其他解决方案更新用户界面。例如,您可以:
-
用
AsyncTask
替换线程,并在onPostExecute()
中更新UI -
让线程
post()
和Runnable
(使用Spinner
(在线程的工作完成后在主应用程序线程上运行Runnable
-
将线程替换为
RxJava
Observable
,将其工作安排为后台线程(例如Schedulers.io()
(,并在主应用程序线程(AndroidSchedulers.mainThread()
(上观察它 -
将线程封装在
LiveData
对象中,并让UI代码观察LiveData
以完成工作 -
等等