2017-12-03 6 views
0

私は、ソースコードの構文ハイライトを提供するAndroidアプリを書いています。大きなファイルを高速に処理したいので、構文強調表示タスクをノンブロッキングにしました。私はUIを変更するので別のスレッドでタスクを実行することはできませんが、それはSpannableStringBuilder.setSpan()何千回も呼び出すため、CPUを大量に消費します。Android:このシナリオで設定変更をどのように処理すればよいですか?

私がこの問題に遭遇したアプローチは、一度に小さなバッチの作業を行い、それらの間で、入力/レンダリングコードを実行させる作業を設計することでした。設定の変更を処理しようとしているときに、私が問題に遭遇しました

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()); 
} 

:ここに私のコードがどのように見えるかの大まかなモデルは、(私はJavaで私のアプリを書いていない)です。私は、あなたが画面を回転させるとAndroidがあなたのアクティビティを破壊して再作成することに気付きました。私はユーザーがこれを行うときに、ソースコードファイル全体を再強調したくない。私がハイライトの途中にいる場合、私は単に中止したところからピックアップしたいと思う。これをどのように達成するのですか?

答えて

0

それがUIスレッドのオフタスクを実行しますが、それでもUIを更新するための方法の一握りがありますUI

を変更するので、私は別のスレッドでタスクを実行することはできません。その中には、(1)AsyncTaskを作成し、そのコールバックからUIを更新する、(2)Serviceを作成してブロードキャストでUIを更新する、(3)ハンドラーを使用してUIに更新を投稿する手動マルチスレッディングです。もちろん、他のものもありますが、それらは主に(3)それを抽象化することで簡単に(3)作ることの領域に入ります。

私がハイライトの途中にいる場合、私は単に中止したところでピックアップしたいと思います。これをどのように達成するのですか?

私が行うための最善の(最も単純な)ものがあなたの仕事をするAsyncTaskを使用し、かつ保持FragmentAsyncTaskをホストだと思います。このブログ記事は、保持された断片の素晴らしいイントロです:https://www.androiddesignpatterns.com/2013/04/retaining-objects-across-config-changes.html

関連する問題