2012-10-18 2 views
2

특정 작업을 실행하기 전에 비동기 작업이 완료되었는지 어떻게 확인합니까? 비동기 작업이 해당 변수의 값을 변경 한 후에 변수를 사용해야합니다. 비동기가 실행되기 전에 코드를 실행하면 인스턴트 메신저가 망가졌습니다. 어떤 도움? 메신저 분명히 비동기 작업에 새로운. 내 코드를 보면 아마도 onPostExecute()를 사용하지 않았으므로 조언이 도움이 될 것입니다. 내 초기 생각은 비동기 작업에 물건을 계속 추가하는 것이었지만 일련의 작업을 수행해야하는 많은 작업이 있기 때문에 이것이 나쁜 습관이라고 생각합니다. 기본적으로, 내가 생각하기에 그것은 다음과 같습니다. UI 비동기 작업이 끝나기 전에 UI 스레드의 작업이 실행되지 않도록하려면 어떻게해야합니까?비동기 작업이 완료된 후에 만 ​​작업을 실행해야합니다.

public class MainActivity extends MapActivity { 
myJSONmap; 

public void onCreate(Bundle savedInstanceState) { 
new AsyncStuff().execute(); 
locatePlace(myJSONmap); 

class AsyncStuff extends AsyncTask<Void, Integer, JSONObject> { 
      @Override 
      protected JSONObject doInBackground(Void... params) { 
       jObject = GooglePlacesStuff.getTheJSON(formatedURL); 
       return null; 
      } 
      @Override 
      protected void onPostExecute(JSONObject result) { 
       // TODO Auto-generated method stub 
       super.onPostExecute(result); 
       myJSONmap = JSONextractor.getJSONHMArrayL(jObject); // getting the parsed data from the JSON object. 
       //the arraylist contains a hashmap of all the relevant data from the google website. 
      } 
     } 

답변

3

당신은 아마 팁 소개 안드로이드 개발자

http://developer.android.com/intl/es/reference/android/os/AsyncTask.html

에 AsyncTask를 대한 자세한 내용을 읽고 싶어, 내 개인적인 선택은 onPostExecute에 부울을 전달하는 것입니다. 그런 식으로 doInBackground가 성공했는지 평가할 수 있습니다. 그런 다음 수행 할 작업을 결정합니다 (오류 메시지 또는 레이아웃 업데이트).

onPostExecute 메소드에서 만 입력하면 데이터가 정상적으로 업데이트된다는 것을 기억하십시오. 귀하의 예에서 doInBackground에

myJSONmap = JSONextractor.getJSONHMArrayL(jObject); 

을 포함시켜야하는 이유는 무엇입니까? 그리고 이와 같이

locatePlace(myJSONmap); 

전화 :

class MyAsyncTask extends AsyncTask<Void, Void, Boolean> { 
    String errorMsg; 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
    } 

    @Override 
    protected Integer doInBackground(Void... v) { 
     try{ 
      jObject = GooglePlacesStuff.getTheJSON(formatedURL); 
      myJSONmap = JSONextractor.getJSONHMArrayL(jObject); 
      //do stuff 
      return true; 
     } catch (JSONException e){ 
      errorMsg="Something wrong in the json"; 
      return false; 
     } 

    } 

    @Override 
    protected void onPostExecute(Boolean success) { 
     if(success){ 
      locatePlace(myJSONmap); 
      //update layout 
     } else { 
      //show error 
     } 


    } 
} 
+0

기본적으로 남아있는 모든 작업이 포함됩니다. onPostExecute() 메서드? 이 좋은 연습 이니? –

+0

예, onPostExecute()는 ** 작업이 완료된 후 ** 완료되어야합니다. – nsemeniuk

+0

onPostExecute()에는 많은 코드 행이있을 수 있습니다. 이거 괜찮아? –

1

당신은 비동기 작업을 실행하는 코드 아래 UE 수 -

MyAsyncTask_a asyncTask_a = new MyAsyncTask_a(); 
         asyncTask_a.execute(); 

doInBackground 번() 작업 만 제어 postExecute로 이동합니다 완료(). doInBackground에서 UI 작업을 수행 할 수는 없지만 preExecute() 및 postExecute()에서 수행 할 수 있습니다.

class MyAsyncTask_a extends AsyncTask<Void, Void, Integer> { 

     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
     } 

     @Override 
     protected Integer doInBackground(Void... arg0) { 
      // TODO Auto-generated method stub 

      return 1; 
     } 

     @Override 
     protected void onPostExecute(Integer result) { 
      // TODO Auto-generated method stub 
      super.onPostExecute(result); 


     } 
    } 

희망이 도움이 될 것입니다.

+1

이 이미 뭘 메신저 아닌가? 내 질문은 : 어떻게 내 비동기 작업이 끝나기 전에 UI 스레드의 작업을 실행하지 마십시오 확인합니다. –

+0

onPostExecute 함수에서 나중에 수행 할 항목을 넣으십시오. IE는 단지 onPostExecute 안에 locatePlace를 호출합니다. – sgarman

+0

UI 실행 스레드에서 실행하려는 모든 내용을 게시 실행 ... 반환 1은 doInBackground 블록이 끝났을 때 실행 만하고 실행 명령을 게시하게됩니다. –

관련 문제