Android:在这种情况下我应该如何处理配置更改?

时间:2017-12-03 22:46:04

标签: java android asynchronous android-activity

我正在编写一个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在您旋转屏幕时会破坏并重新创建您的活动。当用户这样做时,我不想重新突出显示整个源代码文件;如果我正在突出显示,我想简单地选择我离开的地方。我该如何做到这一点?

1 个答案:

答案 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