2013-05-20 2 views
0

Я пытаюсь извлечь мои данные из Parse.com во время заставки.Передача результата AsyncTask другой активности

Я делаю запрос в методе DoInBackground и добавляю все объекты, полученные в объектном векторе (который находится в другом классе).

при переходе на MainActivty все данные получают потерю.

Вот мой код:

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

Похоже, вы используете AsyncTask все неправильно. query.findInBackground() - насколько я могу сказать асинхронный вызов, поэтому вы по существу обматываете один асинхронный вызов в другом. Проблема в том, что выполнение кода продолжается сразу после query.findInBackground(), тем самым заканчивая метод doInBackground(). Поскольку вы переходите к основному действию сразу же после завершения задачи async, может быть, что query.findInBackground() еще не завершен (таким образом, в результате получается пустой/неполный список).

Вы действительно уверены, что вам нужно обернуть все в асинхронный вызов? Есть ли либо времени

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

тейк выполнить или большая часть работы уже в асинхронном findInBackground() вызов? Если это так, я бы сказал, пропустите AsyncTask и сделайте переход вида в методе done() FindCallback.

UPDATE: Я прочитал на ParseQuery и это ясно говорит:

Используя методы обратного вызова, как правило, предпочтительнее, поскольку операция сети не будет блокировать вызывающий поток. Однако в некоторых случаях это может быть проще использовать вызовы find, get или count, которые блокируют вызывающий поток . Например, если ваше приложение уже создало фоновые задания для выполнения работы, эта фоновая задача может использовать блокирующие вызовы и избежать сложности кода обратных вызовов.

И в findInBackground() ясно говорится, что:

Получает список ParseObjects, которые удовлетворяют этот запрос от сервера в фоновом потоке. Это предпочтительнее использовать find(), , если ваш код уже не работает в фоновом потоке.

Поскольку вы уже оборачивать все в качестве AsyncTask вы должны либо пропустить задание асинхронной полностью, так как findInBackground (уже работает в фоновом потоке или переключиться на блокирование find() метода.

Пример без 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

Привет, бриц, спасибо, что ответили. Он выполняет запрос перед тем, как перейти в MainActivity. Я исправил некоторые ошибки в моем коде, и теперь моя проблема заключается в том, что я не знаю, как доставить объект, полученный в результате метода onPostExecute, другому действию (моя активность в спискеAdapter). –

+0

Прошу прощения, но я не могу понять, как он может завершить запрос перед тем, как перейти к основному действию. Я уточню свой ответ, чтобы объяснить мои мысли об этом. – britzl

+0

да ... вы были правы ... :) Я запустил findInBackground на OnCreate с потоком 10 секунд и все хорошо. 2 еще вопросы: 1. Как я могу доставить свой векторный объект в свой списокAdapter? 2. Как я могу запустить поток в точную длину времени, необходимую для метода findInBackground? спасибо ... –

Смежные вопросы