2013-05-20 3 views
0

시작 화면에서 Parse.com에서 데이터를 검색하려고합니다.AsyncTask 결과를 다른 액티비티로 전달

DoInBackground 메서드에서 쿼리를 만들고 개체 벡터 (다른 클래스에 있음)에서 검색 한 모든 개체를 추가하고 있습니다.

MainActivty로 이동하면 모든 데이터가 손실됩니다. 모든 잘못 AsyncTask를를 사용하는 것처럼

private class loadDataTask extends AsyncTask<Void, Void, Vector<PartyObj>>{ 


    @Override 
    protected Vector<PartyObj> doInBackground(Void... params) 
    { 
     ParseQuery query = new ParseQuery("partyObj"); 
     query.whereExists("Name"); 
     query.findInBackground(new FindCallback() { 

      @Override 
      public void done(List<ParseObject> mNameList, ParseException e) { 
       if (e == null) { 
         adapter.partyVector = new Vector<PartyObj>();    
         for(int i=0; i<mNameList.size(); i++){ 
          PartyObject party = new PartyObject(); 
          party.setIndex(i); 
          party.setmName(mNameList.get(i).getString("Name").toString()); 
          adapter.partyVector.add(party); 

       } 
         }else { 
         Log.d("mNameList", "Error: " + e.getMessage());       
        } 

      } 
     }); 
     return adpater.partyVector; 
    } 


    @Override 
    protected void onPostExecute(Vector<PartyObj> result) { 
     progressDialog.dismiss(); 
     setContentView(R.layout.activity_main_menu);    
    } 

} 

답변

0

것 같다 :

여기 내 코드입니다. query.findInBackground()는 비동기 호출을 말할 수있는 한도 내에서 비동기 호출을 본질적으로 다른 호출로 래핑합니다. 이 문제는 query.findInBackground() 바로 다음에 코드 실행이 계속되어 doInBackground() 메서드가 종료된다는 것입니다. 비동기 작업이 완료되면 즉시 기본 활동으로 이동하므로 query.findInBackground()가 아직 완료되지 않았을 수 있습니다 (따라서 빈/부분 목록이 생성 됨).

비동기 호출에서 모든 것을 랩핑해야합니까?

ParseQuery query = new ParseQuery("partyObj"); 
query.whereExists("Name"); 

실행 시간이 오래 걸리거나 이미 async findInBackground() 호출에있는 작업이 대량입니까? 그렇다면, AsyncTask를 건너 뛰고 FindCallback의 done() 메소드에서 뷰 전환을 수행한다고 말하고 싶습니다.

업데이트 : ParseQuery에 읽었하고 분명하게 말한다 : 네트워크 작업이 호출 스레드를 차단하지 않기 때문에

콜백 방법을 사용하여 일반적으로 바람직하다. 그러나 경우에 따라 은 호출 스레드를 찾거나 가져 오거나 카운트하는 것이 더 쉬울 수도 있습니다. 호출은 호출 스레드를 차단합니다. 예를 들어, 응용 프로그램에서 작업을 수행하기 위해 백그라운드 작업을 으로 이미 생성 한 경우 해당 백그라운드 작업에서 블로킹 호출을 사용하고 콜백의 코드 복잡성을 피할 수 있습니다.

는 백그라운드 스레드에서 서버에서이 쿼리를 만족 ParseObjects의 목록을 검색합니다 :

그리고는 findInBackground()에 명확하게 나와 있습니다. 코드가 이미 백그라운드 스레드에서 실행되고 있지 않으면 find(), 을 사용하는 것이 좋습니다.

당신은 이미. 당신이 findInBackground은 (이미 백그라운드 스레드에서 실행되는 완전히 때문에 비동기 작업을 건너 뛰거나 차단 find() 방법으로 전환해야한다 어느 쪽 AsyncTask를 모든 것을 포장 AsyncTask를하지 않고

예 만 사용하고 있기 때문에 비동기 findInBackground() :

ParseQuery query = new ParseQuery("partyObj"); 
query.whereExists("Name"); 
query.findInBackground(new FindCallback() { 

    @Override 
    public void done(List<ParseObject> mNameList, ParseException e) { 
     if (e == null) { 
      adapter.partyVector = new Vector<PartyObj>();    
      for(int i=0; i<mNameList.size(); i++){ 
       PartyObject party = new PartyObject(); 
       party.setIndex(i); 
       party.setmName(mNameList.get(i).getString("Name").toString()); 
       adapter.partyVector.add(party); 
      } 

      progressDialog.dismiss(); 
      setContentView(R.layout.activity_main_menu);      
     } 
     else { 
      Log.d("mNameList", "Error: " + e.getMessage());       
     } 

    } 
}); 

AsyncTask를 가진 예 및 차단 발견()

private class loadDataTask extends AsyncTask<Void, Void, Vector<PartyObj>>{ 

    @Override 
    protected Vector<PartyObj> doInBackground(Void... params) 
    { 
     ParseQuery query = new ParseQuery("partyObj"); 
     query.whereExists("Name"); 
     Vector<PartyObject> v = new Vector<PartyObject(); 
     try { 
      List<ParseObject> queryResult = query.find(); 
      for(ParseObject po : queryResult) { 
       PartyObject party = new PartyObject(); 
       party.setIndex(partyVector.size()); 
       party.setmName(po.getString("Name").toString()); 
       v.add(party); 
      } 
     } 
     catch(ParseException e) { 
      Log.d("mNameList", "Error: " + e.getMessage()); 
     } 
     return v; 
    } 

    @Override 
    protected void onPostExecute(Vector<PartyObj> result) { 
     adapter.partyVector.addAll(result); 
     progressDialog.dismiss(); 
     setContentView(R.layout.activity_main_menu);    
    } 
} 
+0

안녕하세요, britzl, 응답 해 주셔서 감사합니다. MainActivity로 이동하기 전에 쿼리를 완료합니다. 내 코드에서 일부 오류가 수정되었으며 내 문제는 이제 다른 활동 (내 listAdapter 활동)에 onPostExecute 메서드의 결과에서 가져온 개체를 전달하는 방법을 모른다는 것입니다. –

+0

죄송하지만 기본 활동을 시작하기 전에 쿼리를 완료하는 방법을 알 수 없습니다. 나는 내 생각을 설명하기 위해 나의 대답을 업데이트 할 것이다. – britzl

+0

예 ... 당신이 옳았어요 ... :) 10 초 스레드로 OnCreate에서 findInBackground를 실행하면 모두 좋습니다. 2 질문 더 : 1. 내 벡터 객체를 내 listAdapter에 어떻게 전달합니까? 2. findInBackground 메서드에 필요한 정확한 시간 길이의 스레드를 어떻게 실행할 수 있습니까? 감사합니다 ... –

관련 문제