2016-10-04 1 views
2

ProgressDialog을 사용자에게 보여 주면서 비교적 짧은 (2-3 초) 백그라운드 작업을 수행하고 싶습니다. (작업 시작 부분에 ProgressDialog을 표시하고 끝에 표시하고 싶습니다.)백그라운드 작업 중에 구성 변경 사항을 처리하는 가장 최신의 방법은 무엇입니까?

여러 접근법을 시도했지만 모두 제대로 해결할 수없는 단점이 있습니다.

난 시도한 것들 :

  • AsyncTask

    메모리 누수 문제를 이용하여 해결 될 수 WeakReference합니다 (Activity에 대한 참조를 유지하도록),하지만이 다시 호출 할 수있다 newActivity 인스턴스가 실행 중일 때 다시 생성되면 인스턴스가 변경됩니다 (예 : 방향 변경의 경우).

  • AsyncTask

    은 머리가없는 Fragment에 싸여 :

    onCreate()의 외부 Fragment 트랜잭션을 커밋 종종 Can not perform this action after onSaveInstanceStateIllegalStateException 나에게 제공합니다.

    commitAllowingStateLoss()을 사용하면 적절한 해결책이 아닐 수 있습니다.

    onCreate()Fragment을 추가하면 전혀 필요하지 않더라도 Activity에 붙어 있다는 것을 의미합니다. 거대한 잔인한 느낌입니다.

    구현할 때 엉덩이에 통증이 있습니다. 예를 들어 여러 개의 AsyncTask이있는 경우입니다. 나는 Fragment을 생성해야하는데, 이는 AsyncTask 내부 클래스를 포함하고 있습니다.이 클래스는 기분이 좋지 않습니다. 각 작업마다 별도의 Fragments을 작성해야합니다. 관리하기가 다소 어렵고 혼동을 줄 수 있습니다.

  • IntentService + LocalBroadcastManager

    내가 (onCreate()에서, 그리고 onDestroy()에 등록을 취소) 가능한 한 빨리 내 수신기를 등록, 여전히 가능하다면 방송은 오리엔테이션 오는이 방법 내 문제는 짝수 변경, 이후 onDestroy() 그리고 전에 onCreate(), 그래서 나는 방송을 놓친다.

구글은 그렇게 열심히 구성 변경을 처리 할 수 ​​있습니다 이유를 정말 이해가 안 (끈적 방송은되지 않으며 구글에 따라 사용할 수 없습니다).

어떻게해야합니까?

미리 감사드립니다.

답변

4

RxJava는 백그라운드 작업을 수행하는 데 과도한 부담이되며 원본 게시물에 언급 된 문제를 실제로 수정하지 않습니다. 배경에서 실행하고 유지해야하는 항목에 대한 선호하는 접근 방식은 Loader입니다. 이것은 라이프 사이클을 인식하도록 설계되었으며, 새로운 Activity를 리바 인딩하기 쉽고 결과는 즉시 또는 리바 인하는 즉시 (멈추지 않거나 레크리에이션 중에는 절대 전달되지 않음) 전달됩니다.

이렇게하면 조각 상태 손실 문제가 해결되지 않으며 비동기 작업에 대한 응답으로 조각을 변경해야하는 경우이를 해결할 수있는 일반적인 방법이 없습니다. CommitAllowingStateLoss를 사용하고 다음 이력서에서 상태를 수정하거나 진행 상황이 인라인으로 표시되도록 디자인을 변경하십시오 (Dianne Hackborn의 의견 here 참조)

0

RxJava를 사용해 보셨나요? 리 액티브 함수 프로그래밍을위한 라이브러리는 상당히 까다 롭습니다. 그러나 얼마 동안은 그것을 사용했고 보람적입니다.

는 살펴 유무 : https://www.youtube.com/watch?v=k3D0cWyNno4

0

AsyncTask를 매우 오래된 기술, 당신은 동시 작업을 주관 rxJava 라이브러리를 사용해야합니다. 이 도구를 사용하면 한 스레드에서 작업을 시작하고 다른 스레드에서 작업하고 다른 스레드에서 결과를 처리 할 수 ​​있습니다. 또한 두 개의 기본 스레드 풀을 가지고 있으며 모든 스레드를 단일 스레드에서 수행 할 수 있습니다. 활동 및 단편은 화면의 방향과 장치 상태 (앱 표시 또는 최소화)에 따라 달라지는 UI입니다. IntentService는 백그라운드 작업을 수행 할 수 있으며 자체 스레드를 가지고 있지만 작업이 완료되면 중지됩니다. 그렇다면 제대로 작동한다면 IntentService에서 브로드 캐스트를 보내 야스크 상태에 대한 활동을 알릴 필요가 있습니다. 더 나은 솔루션이 있습니다. 일반 서비스를 먼저 시작한 다음 Activity에 바인딩 할 수 있습니다. 바인딩 프로세스 중에는 서비스의 인터페이스가 제공되며 직접 서비스를 이용할 수 있습니다. Inside Service는 rxJava 라이브러리를 사용하여 백그라운드 작업을 구성합니다. https://github.com/Froussios/Intro-To-RxJava

관련 문제