Если игровой цикл должен быть помещен в AsyncTask

Я делаю игру для Android, которая состоит из постоянно работающего игрового цикла, а также из пользовательского интерфейса Android. Поэтому для одновременной работы они должны быть в разных потоках.

Я планирую поместить игровой цикл в AsyncTask, однако в документации developer.android сказано, что

AsyncTasks should ideally be used for short operations (a few seconds at the most.)

Теоретически мой игровой цикл будет работать бесконечно и почти всегда дольше нескольких секунд. Подходит ли asynctask для этого, или есть другой предпочтительный метод для разделения игрового цикла и операций пользовательского интерфейса?

AsyncTasks и UI не работают очень хороший пример, вы не можете использовать UI в doInBackground, но на onPostExecute вы можете
Crammeur 04.08.2018 20:39

Я не помещаю элементы пользовательского интерфейса в AsyncTask, я просто хочу запустить цикл while (true) внутри одного во время работы игры.

Brooklyn 04.08.2018 20:44
0
2
135
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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() быть создан внутри класса активности или есть способ реализовать его как автономный.

Brooklyn 04.08.2018 21:09

Вы можете использовать это где угодно. Поток будет работать нормально. И, поскольку это процесс, отличный от потока пользовательского интерфейса, он не будет блокировать какие-либо операции пользовательского интерфейса Android.

Jian Astrero 05.08.2018 03:35

Хотя 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);

Помните, что многопоточность - самая простая часть. Правильная синхронизация - это сложно.

Другие вопросы по теме