我不确定我在这里做错了什么,但是我的主线程被阻止了(根据Android Studio的消息:I / Choreographer:跳过了1009帧!该应用程序可能在其主线程上做了太多工作。)我正在使用单独的线程使用itext创建我的PDF。
+
我的Spinner类,我的吐司面包也没有显示,它们都写在主线程中(可能是因为主线程根据消息没有响应)。创建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()
答案 0 :(得分:1)
尽管我使用单独的线程使用itext创建我的PDF
但是随后您要用一个连续循环(while (threadPDF.isAlive)
)捆绑主应用程序线程。
删除该while
循环。完成工作后,请使用其他解决方案来更新UI。例如,您可以:
用AsyncTask
替换线程并在onPostExecute()
让线程post()
和Runnable
(使用Spinner
)使Runnable
在线程工作完成后在主应用程序线程上运行
用RxJava
Observable
替换您的线程,在其中您安排其工作为后台线程(例如Schedulers.io()
),并在主应用程序线程({{ 1}})
将线程包装在AndroidSchedulers.mainThread()
对象中,并让您的UI代码观察到LiveData
以完成工作
以此类推