在我的应用程序初始化期间,我有一个任务需要大约10秒的UI线程,我决定将它放在后台线程中并显示启动屏幕,而这正在进行..我使用AsyncTask工作了...但是由于AsyncTasks优先级被硬编码得如此之低,并且没有办法增加它我能找到的任务,任务从花了10秒钟完成到几分钟。
所以,我的问题是,如何在没有AsyncTask的情况下在NON UI线程上运行任务?到目前为止,我尝试过的所有内容似乎都在UI任务上运行,这会阻止SplashScreen在任务完成之后出现。
那么如何创建一个线程,在非UI线程上运行呢?我假设除了AsyncTask之外必须有一个选项,但到目前为止我还没有找到它......处理程序似乎只是在UI上运行,标准线程/ runnables也是如此。这必须是可能的,但我只是没有搞清楚。
答案 0 :(得分:10)
既然你已经让AsyncTask
工作了,也许你可以从doInBackground()
内部突出它的优先级:
protected Void doInBackground() {
Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
/* do the work */
}
另外,对于Handler
,不完全确定问题是什么,但是你需要在UI线程中创建Handler
,显式启动一个不同的线程来完成你的工作,然后使用来自该新线程的处理程序将消息发布到UI线程。 AsyncTask
很好,因为它会照顾你所有这些。
答案 1 :(得分:1)
只需创建Thread
,设置您想要的任何优先级并start()
。或者使用Runnable
和Executor
。那些不会在UI线程上运行。如果您需要在后台工作完成时通知用户界面,请在启动主题之前创建Handler
并将其传递给Thread/Runnable
。