Я хотел бы знать, как создать 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?
Чтобы ответить на ваш вопрос: для создания 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();
}
}
Это важно, даже если вы не спрашивали об этом: 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();
}
}
Отказ от ответственности: хотя я исправил некоторые ошибки в коде выше, я не тестировал его. Все еще могут быть ошибки.
Попробуй это,
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();
вам необходимо передать контекст приложения для создания представлений, и вы можете изменять только пользовательский интерфейс в потоке пользовательского интерфейса.
Кроме того, если ваш поток вышел из класса активности, поэтому вы можете вызвать runOnUiThread
активности runOnUiThread
, вы можете использовать обработчик. Вы создаете объект-обработчик в основном потоке активности и передаете его как аргумент желаемому запущенному объекту. Затем в исполняемый код вы можете использовать метод post(Runnable r)
обработчика для обновления пользовательского интерфейса из потока без каких-либо проблем.