Похоже, вы используете 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);
}
}
Привет, бриц, спасибо, что ответили. Он выполняет запрос перед тем, как перейти в MainActivity. Я исправил некоторые ошибки в моем коде, и теперь моя проблема заключается в том, что я не знаю, как доставить объект, полученный в результате метода onPostExecute, другому действию (моя активность в спискеAdapter). –
Прошу прощения, но я не могу понять, как он может завершить запрос перед тем, как перейти к основному действию. Я уточню свой ответ, чтобы объяснить мои мысли об этом. – britzl
да ... вы были правы ... :) Я запустил findInBackground на OnCreate с потоком 10 секунд и все хорошо. 2 еще вопросы: 1. Как я могу доставить свой векторный объект в свой списокAdapter? 2. Как я могу запустить поток в точную длину времени, необходимую для метода findInBackground? спасибо ... –