2014-11-17 2 views
0

Я немного новичок в 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 
     } 
    } 
} 

ответ

0

(Edit: Я отредактировал мой ответ основан на комментарий nempoBu4 в)

Вот некоторая информация о AppEngine Endpoints и используя Endpoints в Android клиента: Udacity имеет курс, охватывающий App Engine это может быть стоит вашего времени. https://www.udacity.com/course/ud859

Вы должны прочитать их код клиента Android и посмотреть, как они потребляют методы Endpoint на клиенте. Это на GitHub. Приложение называется Conference Central. https://github.com/udacity/conference-central-android-app

Так где же есть правило, где говорится, что мы можем сделать только один вызов методов GCE для AsynTask? Я так не думаю, что я сделал несколько обращений к моему серверу из фонового потока с использованием конечных точек без проблем. Единственное, что я мог бы беспокоиться об этом в одиночной AsyncTask, - это время, которое потребуется для завершения. «AsyncTask разработан как вспомогательный класс вокруг Thread и Handler и не представляет собой общую структуру потоков. AsyncTasks в идеале следует использовать для коротких операций (максимум на несколько секунд).« Согласно Android Reference на AsyncTask.

Любые предложения по созданию цикла вызовов методам GCE? Я настроил IntentService для использования методов конечных точек в фоновом потоке. Это довольно просто использовать, просто следуйте инструкциям разработчиков. Он поместит вызовы в службу в очередь, а затем, когда служба опустит очередь, она закроет себя. Вы можете настроить диспетчер Broadcast для обработки результатов.

Удачи.

+0

Хотя эта ссылка может ответить на вопрос, лучше включить основные части ответа здесь и предоставить ссылку для справки. Ответные ссылки могут стать недействительными, если связанная страница изменится. – nempoBu4

+0

Нет, ссылки не отвечают на его вопрос. Есть несколько вопросов, заданных выше. Мой ответ только пытается ответить на его последний вопрос. Любое предложение сделать aloop вызовов GAE? Что я предлагаю IntentService. Ссылки просто дают некоторую информацию о GAE и ее использование в клиенте Android. – Boo

+0

Йенс вы даже прочитали мой ответ? Я удалил вопрос над вопросами. Но вы действительно должны прочитать прохождение, о котором вы комментируете. – Boo

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