确保UI线程不被中断

时间:2014-06-12 00:42:02

标签: android

我有一个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感觉不稳定。问题似乎是主线程经常被抢先一步:

Traceview of running process

当网络延迟很高时,我想要大量的线程,以便在必要时它们都可以在网络上阻塞。但是,我只希望那些线程在ui基本上没有别的事情可以运行时运行;我很好地显示透明视图一段时间,一切都加载,只要ui在加载时响应(有一些文本视图和东西,所以它不仅仅是一个空白的屏幕)。

如何指示android为我的ui线程赋予更高的优先级,和/或对AsyncTasks的优先级更低?

1 个答案:

答案 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) {}