【问题标题】:Android: How should I handle configuration changes in this scenario?Android:在这种情况下我应该如何处理配置更改?
【发布时间】: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


    【解决方案1】:

    我无法在单独的线程上运行该任务,因为它会修改 UI

    有几种方法可以在 UI 线程之外运行任务,但仍会更新 UI。其中包括 (1) 创建一个 AsyncTask 并通过其回调更新您的 UI,(2) 创建一个 Service 并通过广播更新您的 UI,以及 (3) 使用处理程序手动多线程将更新发布到您的用户界面。当然还有其他的,尽管它们大多属于通过抽象(部分)使(3)对您更容易的领域。

    如果我正在突出显示,我只想从上次中断的地方继续。我该如何做到这一点?

    我认为最好(也是最简单)的做法是使用AsyncTask 来完成您的工作,并将AsyncTask 托管在保留的Fragment 中。这篇博文很好地介绍了保留片段:https://www.androiddesignpatterns.com/2013/04/retaining-objects-across-config-changes.html

    【讨论】:

      猜你喜欢
      • 2012-12-16
      • 1970-01-01
      • 1970-01-01
      • 2016-06-22
      • 2014-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多