在单独的线程中创建PDF仍然使主线程没有响应



我不确定我在这里做错了什么,但我的主线程被阻止了(根据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

  • 将线程替换为RxJavaObservable,将其工作安排为后台线程(例如Schedulers.io()(,并在主应用程序线程(AndroidSchedulers.mainThread()(上观察它

  • 将线程封装在LiveData对象中,并让UI代码观察LiveData以完成工作

  • 等等

最新更新