我正在编写一个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在您旋转屏幕时会破坏并重新创建您的活动。当用户这样做时,我不想重新突出显示整个源代码文件;如果我正在突出显示,我想简单地选择我离开的地方。我该如何做到这一点?
答案 0 :(得分:0)
我无法在单独的线程上运行任务,因为它修改了UI
有一些方法可以从UI线程运行任务但仍然更新UI。其中包括(1)创建AsyncTask
并从其回调更新UI,(2)创建Service
并通过广播更新UI,以及(3)使用处理程序手动多线程发布您的UI更新。当然还有其他一些,尽管它们大多属于通过抽象(部分)来使你更容易使你变得更容易。
如果我正处于突出显示的中间,我想简单地选择我离开的地方。我该如何做到这一点?
我认为最好(也是最简单)的事情是使用AsyncTask
来完成工作,并在保留的AsyncTask
内托管Fragment
。这篇博文是保留片段的一个很好的介绍:https://www.androiddesignpatterns.com/2013/04/retaining-objects-across-config-changes.html