2011-06-13 2 views
8

많은 곳에서 문제없이 AsyncTask를 사용하고 있습니다.AsyncTask를 "절차 적"으로 만드는 패턴

허니컴에서는 모든 네트워크 I/O가 동기식 네트워크 연결이 적합하기 전에 많은 경우에 AsyncTasks가 필요한 UI 스레드와 별도로 스레드에 있어야합니다 (Honeycomb이 예외를 throw합니다). 주/ui 스레드의 모든 네트워크 입출력).

이제 기본적으로 Object result = MyAsyncTask().execute()과 같은 것을 얻고 싶습니다. 좋은 패턴이 있습니까?

AsyncTask Android - Design Pattern and Return Values 나는 GWT가 어떤 일을하는지 이해하지만 어쨌든 이것은 꼬리에 개가 흔들리는 것처럼 들립니다. (그리고 나서 뇌가 좀 더 비틀어 져야합니다.)

답변

13

예. 너 가까이있어. 시도해보십시오.

Object result = MyAsyncTask().execute().get(); 
+0

고마워요. 제가 정확히 찾고 있던 것이 었습니다. 어떻게 그 일을 처음으로 놓칠 수 있었 을까? 일부 파트의 경우 GWT 패턴이 매우 훌륭하지만,이 비동기 taks가 완료 될 때까지 get ...은 많은 의미가 있습니다. –

+7

UI 스레드에서 execute(). get()을 호출하는 것은 사실상 UI 스레드에서 작업을 실행하는 것과 거의 동일합니다. 이렇게하면 주 스레드에서 네트워크 호출에 대한 예외를 발생시키지 않지만 작업의 영향을 피할 수는 없습니다. 네트워크 작업이 완료 될 때까지 UI 스레드가 차단됩니다. PostExecute 메서드를 사용하면 주 스레드가 사용 가능할 때까지 기다릴 수 있으므로 교착 상태가 발생할 수 있습니다. IMHO 당신은 AsyncTasks에 대한 안티 패턴을 제시하고 있습니다. –

4

UI 스레드에서 동기식 네트워크 트랜잭션을 수행하고 싶지 않습니까?

내가 사용하는 패턴은 (수신기를 구현하는) 액티비티에서 상태를 유지 한 다음 onPostExecute()에서 액티비티에 대한 콜백을 수행하는 (즉, 액티비티가 수신중인 인 텐트를 실행하는) AsycTask를 호출하는 것입니다. 그런 다음 귀하의 활동은 의도에 따라 추가로 상태를 업데이트하고 처리를 계속할 수 있습니다. 그것은 기본적으로 귀하의 로그인 및 기타 기능을 수행하는 귀하의 활동에서 개최되는 상태 기계입니다. 모든 네트워크 I/O 작업은 상태가 완료되면 업데이트되도록하는 AsycTask 인스턴스에서 수행됩니다.

+0

예, UI 스레드가 아닙니다. HC 이전에는 이것이 가능했지만 (장소가 어디인지), HC는 UI 스레드에서 네트워크 호출에 대해 예외를 발생시킵니다. –

1

스레드를 차단하려는 경우 다른 스레드가 작업을 수행하는 동안 자신 만의 작업 추상화를 작성할 수 있습니다. 나는 무엇이든을 생각하고있다

public class MyTask <T> { 
    // define executor here 
    public T execute(Callable<T> c) { 
     Future<T> t = executor.submit(c); 
     return t.get(); 
    } 
} 
관련 문제