Как создать TextView в потоке?

1

Я хотел бы знать, как создать TextView внутри потока:

Thread t = new thread() {
  public void run() {
    for(int i = 0; i < 63; i++) {
      TextView tv = new TextView();
      tv.setText("What to do");
    }
  }
}
t.start();

То, что я не понимаю, что делать, - это то, что должно быть внутри метода построения для TextView?

Теги:

3 ответа

3
Лучший ответ
  1. Чтобы ответить на ваш вопрос: для создания TextView вы должны предоставить его Context. Activity и Application расширяют Context и чаще всего используются там, где необходим Context. В вашем случае вы должны использовать Activity, в котором будет отображаться созданный TextView. Итак, чтобы изменить код:

    class MyActivity extends Activity {
      public void someMethod() {
        Thread t = new Thread() {
          @override public void run() {
            for(int i = 0; i < 63; i++) {
              TextView tv = new TextView(MyActivity.this);
              tv.setText("What to do");
            }
          }
        };
        t.start();
      }
    }
    
  2. Это важно, даже если вы не спрашивали об этом: TextView - это элемент управления пользовательского интерфейса. Это только законно, чтобы создать элемент управления пользовательского интерфейса в потоке пользовательского интерфейса. Создание его в другом потоке может привести к возникновению всех неприятностей. Один из способов сделать это из другого потока - использовать метод Activity.runOnUiThread():

    class MyActivity extends Activity {
      public void someMethod() {
        Thread t = new Thread() {
          @override public void run() {
            for(int i = 0; i < 63; i++) {
              runOnUiThread(new Runnable() {
                void run() {
                  TextView tv = new TextView(MyActivity.this);
                  tv.setText("What to do");
                }
              });
            }
          }
        };
        t.start();
      }
    }
    

Отказ от ответственности: хотя я исправил некоторые ошибки в коде выше, я не тестировал его. Все еще могут быть ошибки.

  • 0
    спасибо за ответ. Я пойду проверить его, чтобы увидеть, работает ли он
  • 0
    этот пример работает
2

Попробуй это,

Thread t = new thread(new Runnable() 
{
public void run() 
{
    for(int i = 0; i < 63; i++) 
    {
        runOnUiThread(new Runnable() 
        {
        public void run()
        {
            TextView tv = new TextView(getApplicationContext());
            tv.setText("What to do");
        }
        });
    }
}
});
t.start();

вам необходимо передать контекст приложения для создания представлений, и вы можете изменять только пользовательский интерфейс в потоке пользовательского интерфейса.

  • 0
    спасибо за ответ
0

Кроме того, если ваш поток вышел из класса активности, поэтому вы можете вызвать runOnUiThread активности runOnUiThread, вы можете использовать обработчик. Вы создаете объект-обработчик в основном потоке активности и передаете его как аргумент желаемому запущенному объекту. Затем в исполняемый код вы можете использовать метод post(Runnable r) обработчика для обновления пользовательского интерфейса из потока без каких-либо проблем.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню