2011-01-29 4 views
9

, 나는 활동의 내부 클래스로 AsyncTask를 정의 할 수 있지만,이 두 가지 단점을 가지고 나는 문제가 발견 :Android AsyncTask에서 활동 UI를 변경하는 방법은 무엇입니까? 나는 (AsyncTask를 사용) 별도의 스레드에서 업데이트됩니다 UI를 가지고 시나리오에서

  1. 이 코드 그것은 힘든 스레드 클래스

좋은 해결책은 무엇을 재사용 할 수

  • 관리의 효율성을 감소, 소스 파일이 매우 큰 무엇입니까? 내부 클래스를 사용하지만 모든 것을 추상화하여 다른 클래스에 추상화합니까? 활동에 대한 참조를 AsyncTask에 전달 하시겠습니까? 항상 AsyncTask 클래스를 내부 클래스로 정의하고 소스 파일을 수용하는 것이 클 것입니까?

  • 답변

    2

    몇 가지 예를 들자면 ContextAsyncTask의 생성자로 전달한 것으로 보았습니다.

    public class BackgroundStuff extends AsyncTask<Void, Void, Void> { 
        ... 
        Context mContext; 
        ... 
        BackgroundStuff(Context context){ 
         super(); 
         this.mContext = context; 
        } 
        ... 
    } 
    

    나는 다른 사람들이 다른 접근법을 사용하고 있다면 듣고 싶습니다.

    +0

    클래스에 컨텍스트를 전달하는 것은 현재 내가하고있는 일로 다소 엉망인 것처럼 보이지만 더 좋은 방법은 아닙니다. –

    13

    우선 : AsyncTask을 사용하는 경우 doInBackground() 내에 UI 활동을해서는 안됩니다.

    할 수있는 작업은 다음과 같습니다. 장기 실행 백그라운드 작업의 상태 업데이트는 doInBackground()에서 publishProgress(values)입니다. 그러면 런타임에서 해당 값에 대해 onProgressUpdate(values) 콜백을 호출합니다.이 콜백은 UI 스레드에서 실행되며 UI를 업데이트 할 수 있습니다.

    예를 보려면 https://github.com/pilhuhn/ZwitscherA/blob/master/src/de/bsd/zwitscher/TweetListActivity.java#L336을 참조하십시오.

    AsyncTask는 자체 클래스 파일로 구현할 수 있습니다.

    +0

    doInBackground() 메서드는 UI에 액세스 할 수 없으며 프레임 워크는 시도 할 때 예외를 throw합니다. 하지만 내 질문에 AsyncTask 하위 클래스 실제로 UI를 액세스하는 방법에 더 관련이 있습니다. –

    +0

    @Olli 이것이 내가 말하는 것입니다 : doInBackgrround()는 UI에 액세스하면 안됩니다. onPre | PostExecute() 또는 그 중간에 진행 상황을 게시하여 전후에 수행하십시오. 이 세 가지 콜백 메서드는 UI에 액세스 할 수 있습니다. –

    0

    일반적으로 일반 스레드를 사용하기를 선호하기 때문에 다소 이상한 POV가 있지만 기본적으로 백그라운드 작업을 수행하고 UI를 업데이트하는 방법은 onCreate() 메서드가 끝날 때 처리기를 만드는 것이므로 AsyncTasks가있는 다소 이상한 POV가 있습니다. handleMessage (Message msg) 메소드를 오버라이드 (override)합니다.

    내 스레드에서 매개 변수로 핸들러를 전달하면 스레드에서 핸들러로 메시지를 보내고 이제는 새로운 스레드에서 통신하는 것입니다. 배경 스레드를 UI 스레드에 추가하여 UI에서 작업을 처리 할 수 ​​있습니다.

    이제 AsyncTasks가 비슷한 작업을 수행하지만 처리기의 handleMessage 메서드를 재정의해야 할 필요가 없어 졌다고 생각합니다.

    이 두 가지 접근 방법간에 장점/단점에 대해 더 자세히 알아 보는 것은 재미있을 것입니다.

    +0

    처음에는 Handler를 사용했지만 완전히 주관적인 인식이긴하지만 그걸로 젤화하지 않았습니다.나는 AsyncTask의 명확성을 좋아한다. 보통 클래스를 내부 클래스가 아닌 별도의 클래스로 분류하여 작업 할 수있게 도와주고 Activity 서브 클래스를보다 관리하기 쉽게 유지한다. –

    관련 문제