2012-01-05 6 views
1
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    mTextView = (TextView) findViewById(R.id.text); 

    new Thread(new Runnable() { 
     @Override 
     public void run() { 
      mTextView.setText("Hello"); 
     } 
    }).start(); 

Но если я добавлю задержку для потока, это не сработает. Поэтому я могу манипулировать элементами пользовательского интерфейса из-за потока пользовательского интерфейса. Может ли кто-нибудь прояснить эту ситуацию для меня? }Почему я могу манипулировать элементами пользовательского интерфейса из фонового потока?

+1

Я не уверен, в чем вопрос. –

+0

Он хочет знать, почему он не вылетает при настройке текста TextViews в потоке [non main]. – AedonEtLIRA

+0

Вы правы. Почему код выше работает, когда я устанавливаю текст TextView не из потока пользовательского интерфейса? – drifter

ответ

3

Android фактически не останавливает вас от обновления пользовательского интерфейса вне основного потока. Это всего лишь часовая бомба замедленного действия. Если основной поток пользовательского интерфейса не обновляет пользовательский интерфейс в то время, ваш поток может это сделать. Просто невозможно контролировать, когда это произойдет за пределами SurfaceView.

По крайней мере, это было моим пониманием. Я не знаю, наверняка, на 100%, но я смог (случайно) обновить пользовательский интерфейс из-за пределов основного пользовательского интерфейса. Иногда это сработает, а иногда и нет, поэтому я предполагаю, что это была ConcurrentModificationException в какой-то форме.

+0

Я не знал, что это когда-нибудь будет работать. Насколько я понимаю, это было жесткое и быстрое (принудительное) правило. Спасибо за информацию. Хотя я все же настоятельно рекомендую OP, что вы не хотите вносить изменения в пользовательский интерфейс из разных потоков, даже если он работает для вас во время тестирования. Он может терпеть неудачу на разных устройствах или при разных обстоятельствах. – FoamyGuy

+0

Это может быть быстрый сбой в более поздних версиях ОС, но я знаю, что я делал это раньше, и это была безумно жуткая ошибка, чтобы поймать причину, как я уже сказал, это только иногда крах. – DeeV

+0

Вы пробовали окружить один со сном петлей, пока не найдет возможность обновления интерфейса (это докажет это)? –

1

Нет, если вы используете элементы интерфейса, вы должны сделать это из основного потока.

+0

Но код выше работает. Я могу из текста изменения текста в текстовом редакторе TextView. – drifter

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

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