在单独的线程STILL中创建PDF会使主线程无响应

时间:2018-07-22 20:44:17

标签: android multithreading itext

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

1 个答案:

答案 0 :(得分:1)

  

尽管我使用单独的线程使用itext创建我的PDF

但是随后您要用一个连续循环(while (threadPDF.isAlive))捆绑主应用程序线程。

删除该while循环。完成工作后,请使用其他解决方案来更新UI。例如,您可以:

  • AsyncTask替换线程并在onPostExecute()

  • 中更新UI
  • 让线程post()Runnable(使用Spinner)使Runnable在线程工作完成后在主应用程序线程上运行

  • RxJava Observable替换您的线程,在其中您安排其工作为后台线程(例如Schedulers.io()),并在主应用程序线程({{ 1}})

  • 将线程包装在AndroidSchedulers.mainThread()对象中,并让您的UI代码观察到LiveData以完成工作

  • 以此类推