【发布时间】:2017-12-03 22:46:03
【问题描述】:
我正在编写一个为源代码提供语法高亮的 Android 应用。由于我希望它能够快速处理大文件,因此我将语法高亮任务设为非阻塞。我无法在单独的线程上运行该任务,因为它会修改 UI,但它也是 CPU 密集型的,因为它会调用 SpannableStringBuilder.setSpan() 数千次。
我对这个问题采取的方法是设计任务以一次完成小批量工作,并在它们之间产生并让输入/渲染代码运行。这是我的代码的粗略模型(我的应用程序不是用 Java 编写的):
void onCreate() {
workLoop();
}
void workLoop() {
// For those of you familiar with C#, the actual code was like
// while (true)
// {
// DoSmallBatchOfCpuIntensiveWork();
// await Task.Yield();
// }
doSmallBatchOfCpuIntensiveWork();
Handler uiThreadHandler = new Handler(Looper.getMainLooper());
uiThreadHandler.post(() -> workLoop());
}
我在尝试处理配置更改时遇到了问题。我已经意识到,当您旋转屏幕时,Android 会破坏并重新创建您的 Activity。当用户这样做时,我不想重新突出显示整个源代码文件;如果我正在突出显示,我想简单地从我离开的地方继续。我该如何做到这一点?
【问题讨论】:
标签: java android asynchronous android-activity