Запустите AsyncTask с другого AsyncTask doInBackground ()

Я пытаюсь запустить AsyncTask из другого метода doInBackground() AsyncTask …

Возможно ли это? Если да, как я могу это достичь?

ПОСЛЕДНИЕ ИЗМЕНЕНИЯ:

Идея состоит в том, что я запускаю асинтаску, которая получит мне статусы от Tweeter … Все нормально, пока здесь … Но когда я сталкиваюсь с некоторыми конкретными твитами, мне нужно изменить их с помощью некоторой информации с моего сервера, здесь я сделаю еще одну сеть И, поскольку мне нужно подождать, пока я получу информацию с моего сервера, я:

 GetContent getContentServiceAsyncTask = new GetContent(context); try { tweetText = Uri.decode(getContentServiceAsyncTask.execute( URL_GET_CONTENT, jsonRequest).get()); } catch (InterruptedException e) { Log.e(TAG_DEBUG, "InterruptedException: ", e); } catch (ExecutionException e) { Log.e(TAG_DEBUG, "ExecutionException: ", e); } 

Это начато с уже начатого AsyncTask в doInBackground () …

Я знаю, что могу просто добавить методы в AsyncTask и просто вызвать их в методе doInBackground (), но мне нужно использовать их в других местах, где я запускаю эти AsyncTasks из onPostExecute …

Если вы, ребята, думаете, что для этого есть легкая работа, это не повлияет на мою производительность, это будет здорово … если не я сделаю некоторые статические методы, которые я буду вызывать во всех AsyncTasks, которые мне нужны (но это Потребует от меня модификации большого количества моего кода)

Согласно сообщению ниже, вы можете сделать Activity.runOnUiThread () для запуска Runnable в main-Thread (из другого потока).

  • Запуск кода в основном потоке из другого потока

Теоретически вы можете это сделать:

  • Запустить задачу Async
  • Выполните Activity.runOnUiThread ( Runnable ) внутри вашей AsyncTask и запустите новую AsyncTask изнутри этой runnable

Поскольку имя говорит, что Activity.runOnUiThread () выполняет runnable в основном потоке

Но это хакки.

Код должен выглядеть примерно так: (не тестировал)

 // first task (new AsyncTask<String, String, String>() { @Override protected String doInBackground(String... params) { ParentActitity.this.runOnUiThread(new Runnable() { @Override public void run() { //second async stared within a asynctask but on the main thread (new AsyncTask<String, String, String>() { @Override protected String doInBackground(String... params) { // TODO Auto-generated method stub return null; } }).execute(); } }); return null; } }).execute(); 

Этот вложенный пример не является хорошим стилем для использования в производстве, потому что (IMHO) его близок к нечитабельному.

Дополнительные замечания:

Activity.runOnUiThread (Runnable) не является статическим! Вот почему мой пример использует ParentActivity (.this) .runOnUiThread (Runnable).

AsyncTasks предполагается запускать из основного (UI) потока. Вы не должны запускать другую AsyncTask из doInBackground, потому что этот метод выполняется в потоке, отличном от UI.

В вашем случае я могу предложить вам две вещи:

  1. Объедините обработку ваших обоих AsyncTaks в одном запросе
  2. Запустите вторую AsyncTask из onPostExecute вашей первой задачи.

Вы не можете сделать это в doInBackground() но вы можете использовать onProgressUpdate() например, поскольку он работает в потоке пользовательского интерфейса. Просто имейте в виду, что после 3.0 они будут помещены в одну очередь и не будут работать параллельно, см. ExecuteOnExecutor

См. Документацию для AsyncTask() и AsyncTask#execute() . Оба утверждают, что они должны быть вызваны в основной поток пользовательского интерфейса.

В основном образец я написал;

 public class MainActivity extends Activity { View view; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); view = new View(this); setContentView(view); view.setBackgroundColor(Color.RED); new FirstTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, null); } private class FirstTask extends AsyncTask<Void, Void, Void> { @Override protected Void doInBackground(Void... params) { new SecondTask().execute(); try { Thread.currentThread().sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } Log.e("task","first"); return null; } @Override protected void onPostExecute(Void result) { view.setBackgroundColor(Color.GREEN); } } private class SecondTask extends AsyncTask<Void, Void, Void> { @Override protected Void doInBackground(Void... params) { Log.e("task","second"); return null; } } } 

Не лучше взять эти пару inet-действий и задействовать их, запустив отдельный поток, который будет обрабатывать эту часть управления данными? Google повсюду ставит его шаблоны, которые, если и выглядят ближе всего, все они производятся из простых классов … этот API делает андроид похожим на обратный вызов паука, включающий обратный вызов … Попытайтесь понять основы java и не составит труда написать часть Хорошего кода. Сервисы / контент-резольверы / приемники / загрузчики каким-то образом ограничены … Темы почти способны достичь чего-то, чего вы хотите …

Большинство из вас использует код, не задумываясь и даже не пытаясь понять, как он работает, и понимает, что такое ключ программирования. Я стараюсь не использовать код, основы которого я не знаю. И если мне нужно, я тщательно изучил его. Я использовал Java для черной магии, теперь я думаю, что это DATA FLOW A-> B-> C и т. Д. Хороший FLOW необходим .

РЕДАКТИРОВАТЬ:

Да, я написал решение проблемы youre

Есть много способов добиться того, что вы хотите, но это не мой ответ на сценарий писателя для вас

  • Вы можете использовать класс IntentService, у которого есть встроенная очередь — просто используйте отдельные вызовы startService () для каждой передачи.

  • Вы можете использовать Thread – мой предпочтительный способ

  • Вы можете использовать Сервис

  • Вы можете использовать AsyncTaskLoader

  • Но не используйте ASYNC TASK, если вам нужен огонь больше, чем TWO, ​​связанный друг с другом в ONCE, все они на MODERN PHONES RUNS, как QUEUE, в одном потоке (ps. Вы можете запускать их на EXECUOR в качестве обходного пути)

Поскольку задачи JAVA 1.5 отделены от потоков – добавлено

Что означает du под заказ

THREAD (как мы говорим об этом) не является ОБЪЕКТОМ НАТЯЖНОГО КЛАССА, но это ЗАДАЧА, определенная в методе run () РЕЗЬБОГО КЛАССА, поэтому любой КЛАСС, ПОЛУЧЕННЫЙ ИЗ РЕЗЬБЫ, ПРОДОЛЖАЕТ РЕЗЬБА (ТАК)

  public synchronized void start() { checkNotStarted(); hasBeenStarted = true; /** * look at this line i'ts rerouting run() code of youre thread class * to native method from there thread is created in pure C code */ nativeCreate(this, stackSize, daemon); } 

Например, в POSIX:

 int pthread_create(pthread_t * thread, pthread_attr_t * attr, void * (*start_routine)(void *), void * arg); 

С этого момента мы можем говорить о MULTITASKING, когда ОС выполняет несколько задач в течение определенного периода времени, выполняя их одновременно

Так как JAVA 1.5 является интерфейсом Executor, который обеспечивает способ развязки задания задачи от механики того, как будет выполняться каждая задача, включая сведения о потреблении потоков, планировании и т. Д. Executor обычно используется вместо явного создания потоков. У вас много исполнителей, один из них: ThreadPerTaskExecutor

 class ThreadPerTaskExecutor implements Executor { public void execute(Runnable r) { new Thread(r).start(); } } 

Этот исполнитель создает новый поток для каждой задачи.

Вернуться к AsyncTask:

 AsyncTaskM<P, P, R>.executeOnExecutor(Executor,P); 

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

И да, если вы этого не чувствуете и не знаете достаточно, чтобы кто-то еще это сделал 🙂

Я надеюсь, что это дополнение изменит ваше мнение о вашем голосовании.

Intereting Posts
Как вызвать функцию с обратными вызовами в Java, как я делаю это на C #? Как подключить Bluetooth-устройство к программному обеспечению Android Как заставить Android TODO отображаться в Tasks в Eclipse? Код обнаружения Bluetooth / сканирования не работает после обновления Android 6 на моем Nexus 5 Невозможно заставить warpPerslook OpenCV работать на Android Что такое усовершенствование RecyclerView через ListView? Черный экран вместо мульти-текстурирования Android: открыть браузер с включенным cookie сеансом Практика для разработки проектов Android сразу после проверки SVN в Eclipse Android Studio – приложение не установлено на телефон, но работает Одновременно выбирается только одна радиокнопка Ошибка при удалении фрагмента, содержащего videoView в 4.0.4. Android App – прослушивание звонков в Hangouts Dialer Как использовать метод onActivityResult из класса Activity Обнаружение изменения состояния сети с помощью JobSchedulers в Android