Я делаю игру для Android, которая состоит из постоянно работающего игрового цикла, а также из пользовательского интерфейса Android. Поэтому для одновременной работы они должны быть в разных потоках.
Я планирую поместить игровой цикл в AsyncTask, однако в документации developer.android сказано, что
AsyncTasks should ideally be used for short operations (a few seconds at the most.)
Теоретически мой игровой цикл будет работать бесконечно и почти всегда дольше нескольких секунд. Подходит ли asynctask для этого, или есть другой предпочтительный метод для разделения игрового цикла и операций пользовательского интерфейса?
Я не помещаю элементы пользовательского интерфейса в AsyncTask, я просто хочу запустить цикл while (true) внутри одного во время работы игры.
AsyncTasks предназначены только для коротких операций, как указано в документации. Кроме того, они обычно выполняют некоторую работу, которая не должна мешать пользовательскому интерфейсу. Следовательно, "Асинхронный" и "Задача".
Вместо этого вы должны использовать новый поток. Это называется Многопоточность. Существует множество игровых фреймворков, у которых будут проблемы с пользовательским интерфейсом Android. Хотя вы не указали, о каких операциях пользовательского интерфейса вы говорите, но если вы планируете использовать виджеты (UI) Android, вы можете вызвать Activity.runOnUiThread () для запуска кода в потоке пользовательского интерфейса, например, для изменения текста TextView.
Вот отрывок о том, как создать бесконечный цикл в новом потоке (или что-то в этом роде, я не помню, является ли функция частной):
new Thread(new Runnable() {
@Override
private void run() {
while(true) {
//your code goes here
}
}
});
По сути, я делаю пошаговую боевую систему, которая будет использовать встроенные в Android кнопки XML, текст и т. д., Чтобы позволить пользователю выбирать, что делать, но в фоновом режиме постоянный цикл будет проверять, кто сейчас ход, а если нет. пользователи, посчитайте, что ИИ собирается делать. Думаю, ваш ответ в этом поможет. Должен ли new Thread()
быть создан внутри класса активности или есть способ реализовать его как автономный.
Вы можете использовать это где угодно. Поток будет работать нормально. И, поскольку это процесс, отличный от потока пользовательского интерфейса, он не будет блокировать какие-либо операции пользовательского интерфейса Android.
Хотя AsyncTask
позволяет выполнять фоновые операции и публиковать результаты в потоке пользовательского интерфейса без необходимости манипулировать потоками, в идеале его следует использовать для коротких операций (максимум несколько секунд).
Чтобы упростить задачу, вы можете использовать Handler
или, что еще лучше, изучить различные API, предоставляемые пакетом java.util.concurrent
.
import android.os.Handler;
// Create the Handler
private Handler handler = new Handler();
// Define the code block to be executed
private Runnable runnable = new Runnable() {
@Override
public void run() {
// Insert simulation processing code here
// Repeat 60 times per second
handler.postDelayed(this, 1000 / 60);
}
};
// Start the Runnable immediately
handler.post(runnable);
Помните, что многопоточность - самая простая часть. Правильная синхронизация - это сложно.
AsyncTasks
иUI
не работают очень хороший пример, вы не можете использовать UI вdoInBackground
, но наonPostExecute
вы можете