Toasts
, а также другие компоненты, которые управляют пользовательским интерфейсом, не должны использоваться вне потока пользовательского интерфейса.
Что вы можете сделать, чтобы решить вашу проблему, - это разработать систему обмена сообщениями между нитью, управляющей вашей игрой, и вашим потоком пользовательского интерфейса. Для этого вы можете использовать Handler
и свои средства обмена сообщениями (sendMessage
, post
, postDelayed
...) для отправки сообщений или даже Runnables
для запуска в основной теме.
Если вы создаете Handler
в основном потоке, он автоматически свяжется с циклом событий основного потока, тем самым каждая работа, отправленная ему, будет выполнена в основном потоке.
Основной пример того, что вы могли бы сделать:
class MainActivity extends Activity {
// The handler is associated with your Activity's thread
private Handler _handler = new Handler();
// ...
private Thread _worker = new Thread() {
@Override
public void run() {
_handler.post(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this, "Some text", Toast.LENGTH_SHORT).show();
}
});
}
};
};
В стенографии, вы можете также использовать Activity.runOnUiThread(Runnable r)
, который выполняет данный работоспособной в потоке пользовательского интерфейса по умолчанию.
У меня есть класс для моего потока, я не создаю его в своей основной деятельности. Но я думаю, что понимаю, что вы говорите. Так что, если у меня есть только 3-5 сообщений, я могу использовать сокращенный метод без значительного влияния на игру? Придется подойти к обработчикам ближе, совершенно новым для меня –
Да, вместо этого ваши сообщения будут обрабатываться в потоке пользовательского интерфейса. Если вы демонстрируете тост в разумных темпах, производительность не должна быть проблемой. –
Благодарим вас за это! Причина, по которой я думал, что я не должен вставлять ее в UI-поток, - это то, что я делаю с моим «полным уровнем» экрана, и это, как правило, немного медленнее. Но попробуй это :) –