2013-02-22 2 views
0

То, что я пытаюсь достичь, - это данные совместного доступа между запуском asynctask (doInBackground). Так что происходит, что у меня есть отдельный класс (расширяет Asynctask), который загружает данные и активность со своим собственным классом Async, который я использую для обновления информации в этой деятельности. В основном то, что я пытаюсь достичь, - это поток в активности (поток мониторинга) для работы вместе с загрузчиком и предоставления некоторых данных из класса загрузчика, и когда загрузчик готов, как «мониторинг», так и «загрузчик» должны умереть.Данные об обмене данными Android между запущенными асинтетами

Я попытался использовать переменную volatile, которую я установил с помощью интерфейсов, но без успеха я не могу поделиться информацией между потоками (asynctasks). Любые предложения? Может быть, нужен класс Exchanger?

ответ

1

По какой-либо причине вы не можете использовать функциональность onProgressUpdate? Я могу спутать ваш прецеденте ... но пример может быть следующее:

class MyActivity extends Activity { 

    private AsyncTask<Uri,MyDataObject, MyResult> = new AsyncTask<Uri,MyDataObject, MyResult>() { 
    private MyResult mResult; 

    protected MyResult doInBackground(Uri... uris) {   
     int count = urls.length; 
     mResult = new MyResult() 

     for (int i = 0; i < count; i++) { 
     MyDataObject anObject = mDataLoader.getObject(uris[i]); 
     publishProgress(anObject); 

     mResult.add(anObject); 
     // Escape early if cancel() is called 
     if (isCancelled()) break; 
     } 
     return totalSize; 
    } 

    protected void onProgressUpdate(MyDataObject... data) { 
     addDataToUI(data[0]); 
    } 

    protected void onPostExecute(MyResult result) { 
     Toast.makeText("All Done!", Toast.LENGTH_LONG).show(); 
    } 
    } 
} 
+0

OK позволяет положить его, что> ПУТЬ LoadDataClass (AsyncTask) - переменная прогресса получения устанавливается во время doInbackground Monitor асинхронной задачи в деятельности -> проверить переменный прогресс от loaddataclass и отобразить его, например – Alex

+0

@Alex onProgressUpdate работает в потоке пользовательского интерфейса, поэтому вы передаете данные в это (это то, что второй параметр в AsyncTask для), и ОС заботится о сортировке между потоками. Или вы можете вызвать Activity.runOnUiThread – Rich

+0

@Alex Обновлено с примером – JRaymond

1

Это звучит, как вы хотите, чтобы иметь активность показать некоторую информацию, как данные загружены с помощью загрузчика нить? Поэтому вам необходимо передать некоторую информацию от загрузчика в Activity, обновив интерфейс. В этом случае я не уверен, что вам потребуется второй AsyncTask (и связанный поток) в Activity, так как вам все равно нужно получить данные в основной поток, прежде чем вы сможете обновить интерфейс. Вместо этого вы должны сделать, как JRaymond suggests и просто раздвинуть изменения в основной поток, используя publishProgress и обрабатывать их в основном потоке в onProgressUpdate

Если вам нужно что-то более общее, вы могли бы также рассмотреть возможность использования java.util.concurrent. Например, BlockingQueue может использоваться для реализации шаблона потребителя/производителя. См. the Javadoc for a code snippet.

+0

FYI, метод onProgressUpdate задачи Async происходит в потоке пользовательского интерфейса; AsyncTask был написан, чтобы помочь людям избежать деталей обработчиков (хотя обычно я считаю их более трудными, чем они того стоят) – JRaymond

+0

Вы совершенно правы, используя Handler, как я предлагаю, это просто ручной способ переопределения onProgressUpdate. Я исправлю свой ответ. –

0

Все задачи async (если они выполняются с предоставленным исполнителем) работают в одном и том же фоновом потоке, поэтому их одновременное выполнение невозможно.

Из документации:

Когда впервые, AsyncTasks были выполнены поочередно на одном фоновом потоке. Начиная с DONUT, это было изменено на пул из потоков, что позволяет нескольким задачам работать параллельно. Начиная с HONEYCOMB, задачи выполняются в одном потоке, чтобы избежать общих ошибок приложений , вызванных параллельным выполнением.

Если вы действительно хотите параллельного выполнения, вы можете вызвать executeOnExecutor (java.util.concurrent.Executor, Object []) с THREAD_POOL_EXECUTOR.

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