Я пытался сделать это
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
t=new TextView(this);
t=(TextView)findViewById(R.id.TextView01);
t.setText("Step One: blast egg");
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
t.setText("Step Two: fry egg");
но по некоторым причинам, только второй текст обнаруживается, когда я выполняю его. Я думаю, что это могло бы иметь некоторое отношение Thread.sleep()
блокирование метода. Таким образом, кто-то может показать мне, как реализовать таймер "асинхронно"?
Спасибо.
Я только что опубликовал этот ответ в google-группе android-discuss
Если вы просто пытаетесь добавить текст в представление, чтобы оно отображало "Step One: blast egg Step Two: fry egg" Then consider using t.appendText("Step Two: fry egg");
instead of t. setText("Step Two: fry egg");
Если вы хотите полностью изменить то, что находится в TextView
так, чтобы он говорил "Step One: blast egg" при запуске, а затем говорил "Step Two: fry egg" через некоторое время, вы всегда можете использовать
Runnable пример, который дал sadboy
Удачи
.Первая строка нового текстового представления не нужна
t=new TextView(this);
вы может просто сделать это
TextView t = (TextView)findViewById(R.id.TextView01);
, поскольку фоновый поток, который спит, здесь является примером, но я думаю, что для этого лучше подойдет таймер. вот ссылка на хороший пример использования таймера вместо http://android-developers.blogspot.com/2007/11/stitch-in-time.html
Thread thr = new Thread(mTask);
thr.start();
}
Runnable mTask = new Runnable() {
public void run() {
// just sleep for 30 seconds.
try {
Thread.sleep(3000);
runOnUiThread(done);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
Runnable done = new Runnable() {
public void run() {
// t.setText("done");
}
};
по вашему совету, я использую дескриптор и runnables для переключения / изменения содержимого TextView с помощью «таймера». по какой-то причине при запуске приложение всегда пропускает второй шаг («Шаг второй: обжарить яйцо») и показывает только последний (третий) шаг («Шаг третий: подать яйцо»).
TextView t;
private String sText;
private Handler mHandler = new Handler();
private Runnable mWaitRunnable = new Runnable() {
public void run() {
t.setText(sText);
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mMonster = BitmapFactory.decodeResource(getResources(),
R.drawable.monster1);
t=new TextView(this);
t=(TextView)findViewById(R.id.TextView01);
sText = "Step One: unpack egg";
t.setText(sText);
sText = "Step Two: fry egg";
mHandler.postDelayed(mWaitRunnable, 3000);
sText = "Step three: serve egg";
mHandler.postDelayed(mWaitRunnable, 4000);
...
}
Ваш метод onCreate ()
имеет несколько серьезных недостатков:
1) onCreate
подготавливает ваше действие - так что ничего из того, что вы здесь делаете, не будет видимым для пользователя, пока этот метод не завершится! Например, вы никогда не сможете изменить текст TextView
здесь более ОДНОГО раза, так как только последнее изменение будет отображено и, таким образом, видно пользователю!
2) Помните, что программа Android по умолчанию запускается только в ОДНОМ потоке! Таким образом: никогда не используйте Thread.sleep ()
или Thread.wait ()
в вашем основном потоке, который отвечает за ваш пользовательский интерфейс! (прочтите «Поддерживайте адаптивность вашего приложения» для получения дополнительной информации!)
Что делает ваша инициализация вашей Activity:
TextView
объект t
! TextView
в переменной t
позже. t
(но имейте в виду: он будет отображаться только после завершения onCreate ()
и выполнения основного цикла событий вашего приложения! ) onCreate
- этот никогда не должен выполняться , поскольку он останавливает все действия пользовательского интерфейса и обязательно вызовет ANR ( Приложение не отвечает, см. Ссылку выше!) onCreate ()
и несколько других методов жизненного цикла активности обработаны! Решение:
Установить текст только один раз в onCreate ()
- это должен быть первый текст, который должен быть виден.
Создайте Runnable
и Handler
private final Runnable mUpdateUITimerTask = new Runnable () {
public void run () {
// делаем все, что вы хотите здесь изменить, например:
t.setText ("Второй текст для отображения!");
}
};
частный обработчик финала mHandler = new Handler ();
установить этот исполняемый файл как обработчик, возможно в onCreate ()
(но прочтите мой совет ниже):
// запускаем run () mUpdateUITimerTask через 10 секунд
mHandler.postDelayed (mUpdateUITimerTask, 10 * 1000);
Совет: убедитесь, что вы знаете жизненный цикл Activity
! Если вы сделаете что-то подобное в onCreate ()
, это произойдет только тогда, когда ваше Activity
будет создано в первый раз! Android, возможно, будет поддерживать вашу Activity
в течение более длительного периода времени, даже если она не отображается!
Когда пользователь "запустит" ее снова - а она все еще существует - вы не увидите ваш первый текст больше!
=> Всегда устанавливайте обработчики в onResume ()
и отключайте их в onPause ()
! В противном случае вы получите "обновления", когда ваше Activity
не будет отображаться вообще!
В вашем случае, если вы хотите снова увидеть свой первый текст при его повторной активации, вы должны установить это в onResume ()
, а не в onCreate ()
!