2017-12-03 1 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()); 
} 

: 여기 내 코드가 어떻게 생겼는지의 거친 모델 (I 자바에서 내 응용 프로그램을 작성하지 않은)입니다. Android를 사용하면 화면을 회전 할 때 Android가 활동을 파괴하고 다시 생성된다는 것을 알게되었습니다. 사용자가이 작업을 수행 할 때 전체 소스 코드 파일을 강조 표시하고 싶지 않습니다. 강조 표시가 중간에있는 경우 간단히 중단 한 부분부터 선택하고 싶습니다. 어떻게해야합니까? 그것은 UI를 수정하기 때문에

답변

0

내가 별도의 스레드에서 작업을 실행할 수 없습니다

UI 스레드의 해제 작업을 실행 여전히 UI를 업데이트하는 방법은 소수가 있습니다

. 그 중에는 (1) AsyncTask을 만들고 콜백에서 UI를 업데이트하고, (2) Service을 만들고 브로드 캐스트를 통해 UI를 업데이트하고, (3) UI에 업데이트를 게시하는 처리기를 사용하는 수동 멀티 스레딩입니다. 물론 그들은 다른 것들도 있지만, 대부분은 그것의 추상화 (일부)를함으로써 (3) 당신을 위해 더 쉽게 만드는 영역에 빠지게됩니다.

강조 표시가 중간에있는 경우 간단히 끝내기를 원합니다. 어떻게해야합니까?

내가 할 수있는 최선의 (그리고 간단한) 것은 당신의 일을 할 AsyncTask를 사용하고 유지 Fragment 내부 AsyncTask 호스트라고 생각합니다. 이 블로그 게시물은 보존 된 조각에 대한 훌륭한 소개입니다 : https://www.androiddesignpatterns.com/2013/04/retaining-objects-across-config-changes.html

관련 문제