我有一个GridView,它有点复杂的视图,根据在AsyncTask中从互联网上即时下载的结果计算出来。在下载视图时,它显示默认值:
imageView.setImageDrawable(new ColorDrawable(Color.TRANSPARENT));
当AsyncTask完成时,它会获得一个为它计算的Bitmap。我正在使用ExecutorService来启用AsyncTask并行化:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
loaderPool = Executors.newFixedThreadPool(backendManager.getBackendApplicationContext()
.getResources()
.getInteger(R.integer.loader_thread_count));
}
(我目前将R.integer.loader_thread_count设置为10)
我开始将AsyncTask作为:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
newTask.executeOnExecutor(loaderPool);
} else {
newTask.execute(); // Pre-Honeycomb Post-Donut is parallelized by default.
}
我确保在AsyncTask中设置线程优先级,以便它不会尝试与其他任何东西竞争:
@Override
protected Object doInBackground(Object... params) {
if (isCancelled()) {
return null;
}
// just in case
android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_BACKGROUND);
...
但是,当滚动GridView时,ui感觉不稳定。问题似乎是主线程经常被抢先一步:
当网络延迟很高时,我想要大量的线程,以便在必要时它们都可以在网络上阻塞。但是,我只希望那些线程在ui基本上没有别的事情可以运行时运行;我很好地显示透明视图一段时间,一切都加载,只要ui在加载时响应(有一些文本视图和东西,所以它不仅仅是一个空白的屏幕)。
如何指示android为我的ui线程赋予更高的优先级,和/或对AsyncTasks的优先级更低?
答案 0 :(得分:1)
我想要一个更好的答案,但是现在这似乎有所帮助。
虽然文档声称更高的线程优先级"应用程序通常无法更改为 这个优先事项",就像几年前的谎言一样,似乎(?)显然仍然是谎言 - https://groups.google.com/forum/#!topic/android-developers/b2SKprSxPvw
因此,不是让后台线程更加背景化,而是让我的ui线程在Activity.onCreate()中更具有前瞻性。如果他们将来不允许这种事情,我用try / catch包装它:
try {
android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_DISPLAY);
} catch (Throwable t) {}