Как можно переносить AsyncTask с Android на Java?
AsyncTask очень полезен для синхронизации между потоком пользовательского интерфейса и другими потоками в Android. Поэтому я прочитал его исходный код и попытался портировать java classic (JDK), но не успел, потому что некоторые классы не существуют в java (Message, Handler..).
Я хотел бы создать класс с некоторыми полезными функциями, такими как AsyncTask (который может синхронизироваться между основным потоком и другими потоками):
doInBackground(Params... params)
onProgressUpdate(Progress... values)
onPostExecute(Result result)
publishProgress(Progress... values)
onPreExecute()
onCancelled()
Есть ли способ попробовать это?
Ответы
Ответ 1
1. AsyncTask
специально разработан для андроида для синхронизации потока пользовательского интерфейса и потока без UI, также известного как Нержавеющая резьба.....
2. В Java есть альтернатива AsyncTask, названная SwingWorker
.
См. эту ссылку для простого базового учебника:
http://kodejava.org/how-do-i-use-swingworker-to-perform-background-tasks/
Ответ 2
Согласовано, что SwingWorker
является самым прямым аналогом AsyncTask
Если вы не используете Swing, другой параметр - ThreadPoolExecutor
: http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ThreadPoolExecutor.html
Вот статья, демонстрирующая использование ThreadPoolExecutor
для создания нескольких фоновых потоков: http://www.javacodegeeks.com/2013/01/java-thread-pool-example-using-executors-and-threadpoolexecutor.html
Истекает один фоновый поток, который запускается и завершается без обновления прогресса (что также является общим использованием AsyncTask
в Android), может быть таким же простым, как:
Executors.newSingleThreadExecutor().execute(new Runnable() {
@Override
public void run() {
// do stuff in background
}
});
Ответ 3
Я использую шаблон проектирования Observer для аналогичной ситуации. После нереста фонового потока основной поток переходит в спящий режим. Когда фоновый поток заканчивает асинхронную задачу, он просыпает основной поток сообщением обратного вызова. Это существенно удаляет блок для объекта синхронизации, ожидающего обратного вызова.