Я немного новичок в AsynTasks в Java программирования для Android ...множественные вызовы GCE в пределах 1 AsyncTask
Но, я вижу свою точку (пусть UI продолжается, пока медленные операции бывают)
У меня установлен API GCE (Google Cloud Endpoint). Чтобы получить доступ к нему из приложения Android, он должен быть выполнен в AsynTask в соответствии с тем, что я прочитал.
Мое замешательство заключается в том, каково ограничение в пределах AsyncTask, прежде чем вернуться к onPostExecute?
Очевидное использование, вызывает ваш API один раз.
Так что-то вроде:
final myAPI.Builder builder = newmyAPI.Builder(
AndroidHttp.newCompatibleTransport(), new AndroidJsonFactory(), null);
builder.setApplicationName("mine");
AsyncTask<String, Void, com.appspot.myapp.myAPI.model.sample> publishAPItask =
new AsyncTask<String, Void, com.appspot.myapp.myAPI.model.sample>() {
@Override
protected com.appspot.myapp.myAPI.model.sample doInBackground(String... strings) {
// Retrieve service handle.
myAPI apiServiceHandle = CloudEndpointUtils.updateBuilder(builder).build();
try {
myMethod myMethodCommand = apiServiceHandle.sample().myMethod();
newthing.setthing(myMethodCommand.execute().getthing());
...
, который выполняет последняя строка, но также относится к уже результат. Я читал, что нет-нет. Это правда? От here цитата:
Если вам нужно использовать объект, который должен быть возвращен задачей, использовать метод коррекции onPostExecute в задачах. Если вы запросите объект Lobster из вашего API с помощью AsyncTask, а затем сразу же попробуйте использовать его в следующей строке кода (например, Lobster lobster = new GetLobsterAsyncTask(). Execute (lobsterName); lobster.dance();), вы получите исключение. Таким образом, не только ваш омар «не танцует», он «бросит вам исключение NullPointerException».
Но он немного открыт для интерпретации. Поскольку у меня никогда не было проблемы с вышеупомянутым использованием результата, сразу.
Я, кажется, получаю прерывистые проблемы, когда я добавил еще один вызов после вышеуказанного кода, вызывая другие методы GCE в пределах одной AsynTask - заметьте, не используя результат других вызовов.
myMethod2 meMethod2Command = apiServiceHandle.sample().myMethod2();
newthing2.setthing(myMethod2Command.execute().getthing());
Так есть жесткое правило где-то говорит, что мы можем сделать только 1 вызов методов GCE в AsynTask? Являются ли строки внутри AsyncTask doInBackground() выполненными последовательно или возможно, эти вызовы GCE .execute() выполняются параллельно? Прежде чем переписать пару AsyncTasks, чтобы они содержали только один вызов (и уложили длинную строку в onPostExecute()), я хотел бы убедиться, что я это понимаю ...
Он становится сложным для меня, поскольку у меня есть куча звонков, чтобы сделать даже цикл звонков. Я хочу сделать свой метод GCE. Итак, второй вопрос: Любые предложения для создания цикла вызовов методам GCE? Я также прочитал, что AsynTask может выполняться только один раз.
UPDATE: Я только что ушел с предположением, что мы можем сделать только один вызов GCE для Asynctask. Это вызывает некоторые интересные проблемы для меня, так как мне нужно сделать несколько в определенных обстоятельствах в моем приложении.
В любом случае, то, что для меня получается, представляет собой цикл вызываемых асинтактов, где вызывается каждая асинтеза, заканчивается вызовом другого цикла асинтак в их onPostExecute.
ie. psuedocode:
loop
asynctask 1 defined {
do inbackground {
...;
}
onPostExecute {
loop
asynctask 2 defined {
doinbackground {
...;
};
onPostExecute {
};
};
asynctask2.execute;
end loop;
};
};
asynctask1.execute;
end loop;
А реальная проблема сейчас в том, что мне нужно знать, когда они все завершены, прежде чем делать еще одну операцию.
Я видел пару предложений для массива задач и проверки их статуса или вызова функции, чтобы увеличить счет.
Дайте мне знать, если у вас есть другие идеи ...
--- окончательное обновление Закончено с подсчетом отслеживания потоков. Перед каждым выполнением выше, я увеличиваю 1. В каждый постэкскурт я уменьшал 1. Когда счетчик трекера равен 0, я знаю, что могу назвать нужную конечную операцию.
private class threadtracker {
public int todo;
public threadtracker (String grpid) {
todo = 0;
}
public void add(int adder) {
todo = todo + adder;
Log.v(TAG, " threads:" + todo);
}
public void subtract(int subber) {
todo = todo - subber;
Log.v(TAG, " threads:" + todo);
if (todo == 0) {
//do final operation
}
}
}
Хотя эта ссылка может ответить на вопрос, лучше включить основные части ответа здесь и предоставить ссылку для справки. Ответные ссылки могут стать недействительными, если связанная страница изменится. – nempoBu4
Нет, ссылки не отвечают на его вопрос. Есть несколько вопросов, заданных выше. Мой ответ только пытается ответить на его последний вопрос. Любое предложение сделать aloop вызовов GAE? Что я предлагаю IntentService. Ссылки просто дают некоторую информацию о GAE и ее использование в клиенте Android. – Boo
Йенс вы даже прочитали мой ответ? Я удалил вопрос над вопросами. Но вы действительно должны прочитать прохождение, о котором вы комментируете. – Boo