2012-09-20 3 views
1

정적 메서드가있는 유틸리티 클래스가 있습니다. 이러한 방법은 아래와 같은 백그라운드 작업, 뭔가를 해고 할 수 있다고 가정 :Android : Util 클래스 백그라운드 스레드가있는 정적 메서드 (비동기 작업)

class ExampleAsyncUtil { 
    public static void doSomeAsyncJob() { 
     new AsyncTask<Void, Void, Void>() { 

      @Override 
      protected Void doInBackground (Void... params) { 
       //do heavy job here ... 
       return null; 
      } 
     }.execute(); 
    } 
} 

을 그때 파괴된다 활동 내부의 폴더의 유틸리티 클래스 메서드를 호출 한 후 경우 :

class ExampleActivity extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     ExampleAsyncUtil.doSomeAsyncJob(); 
    } 

    @Override 
    protected void onDestroy() { 

     //should i stop async task in util on destroy ? 

     super.onDestroy(); 
    } 
} 

이 어떤 해를 하는가를? (백그라운드 스레드가 유틸리티 메소드를 호출 한 활동을 참조하지 않는다고 가정)

+1

'Context'없이 AsyncTask를 만드는 타당한 이유가 있습니까? 당신이 그 문제를 사용자에게 할 수있는 것은 그리 많지 않습니다. 예제 단점 : 사용자가 활동을 종료하면 전체 프로세스가 먼저 죽습니다. 작업을 완료하려는 경우 중요합니다. 당신이 그 구조에 대한 당신의 이유를 제공한다면 나는 정교 할 수 있습니다. –

+0

안녕하세요, 답변 주셔서 감사합니다. 예,이 경우 스레드가 될 수 있습니다. 하지만 왜 AsyncTask와 Docs의 Context를 연관시키는 것이 공통된 빈번한 쓰레드 처리 시나리오를 돕는 클래스 인 것 같다. –

+1

컨텍스트와 연결할 필요가 없습니다. 당신의 다른 코멘트에서 스레드를 필요로하는 것처럼 보입니다.이 경우에는 '서비스'를 사용하십시오. 죽일 확률이 훨씬 적어서 살인을 처리 할 도구를 얻을 수 있습니다. 작업을 끝내기 위해 스레드가 필요하지 않으면 사용자의 배터리를 먹지 말고 중지하십시오. –

답변

1

예, UI에서 AsyncTask를 취소해야합니다. 그렇지 않으면 AsyncTask가 유출 될 수 있습니다 (경험에서 이야기하기). 그리고, 누가 알겠습니까? 심지어 다른 스레드가 동일한 스레드에서 시작되는 것을 차단할 수도 있습니다. 구현을 계속 변경합니다 : http://developer.android.com/reference/android/os/AsyncTask.html. 또는 여러 onCreate()가 중복 된 "좀비"AsyncTask를 만들 수 있습니다. 어쨌든 AsyncTask를 의도 한 용도로 사용하는 것이 아닙니다. 수명이 짧고 적절하게 제어되어야합니다. 따라서 정적 인 사업에는 실질적인 이득이없는 것 같습니다.

저는 서비스를 시작하고 그로부터 트레드를 시작하거나 전통적으로 AsyncTask를 활동의 라이프 사이클 내에서 사용해야한다고 생각합니다.

여기 비동기 처리에 대한 유용한 자습서가 있습니다 : http://www.vogella.com/articles/AndroidPerformance/article.html.

+0

안녕하세요, 답변 주셔서 감사합니다.하지만 서비스와 비동기 작업을 이해하고 오래 전에 많은 Lars 튜토리얼을 읽었습니다. 나는 의도적으로이 태스크가 활동이나 리소스에 대한 참조를 저장하지 않는 예제를 제공했다. (따라서 호출 수신 활동에 관심이 없기 때문에 좀비가 아니다.) 이것이 유틸리티 메소드이므로 독립 호출은 올바른 시나리오 일뿐입니다. ... –

+0

... 비동기 작업 (시스템 버전에 따라 대기열 또는 대기열)이있는 구현 변경 사항을 알고 있지만 그 질문은 문제가 아닙니다. 질문의 단서는 정적 메서드에서 새 스레드를 시작하는 것이 어쨌든 정적 메서드를 호출 한 acivity에 바인딩 된 경우이며, 그렇지 않은 것 같습니다 - 그래서 내가 질문에 의미가 명확한 후에 내가 대답을 찾은 것 :). –

+0

그런데 lars vogel의 튜토리얼 예제 인'ThreadsLifecycleActivity'는 새어 나가는 것처럼 보입니다. 이 튜토리얼은 아주 오래되었습니다 (지금 2 년). "고귀한 패턴"이 아닌 "최초의 조사"를 위해 취할 수 있습니다.) –