Я пытаюсь сделать простой поток, который меняет текстовое представление через некоторое время
Проблема в том, что, когда я нажимаю кнопку на секунду, мое приложение падает, и я не понимаю, почему. Когда я щелкаю кнопку во второй раз, предполагается, что снова и снова.
Любая помощь приветствуется.
public class main extends Activity {
Boolean grabar = false;
TextView texto;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
texto = (TextView) findViewById(R.id.texto);
Button startbtn = (Button) findViewById(R.id.button);
startbtn.setOnClickListener(new OnClickListener(){
public void onClick(View v){
background.start();
}
});
}
Thread background = new Thread (new Runnable() {
public void run() {
try {
Thread.sleep(3000);
cambiarHandler.sendEmptyMessage(0);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
Handler cambiarHandler = new Handler() {
public void handleMessage(android.os.Message msg) {
texto.setText("ok");
}
};
}
3 ответа
Проблема, которую я вижу, состоит в том, что потоки предназначены для запуска один раз. Вам нужно создавать новый экземпляр потока каждый раз, когда вы хотите запустить его.
Это вполне может быть связано с политикой Android, согласно которой поток пользовательского интерфейса может только изменять пользовательский интерфейс.
Вместо этого вы должны использовать ASyncTask, если вы хотите изменить пользовательский интерфейс из отдельного потока.
Посмотреть здесь:
Я не знаю, какое исключение выдается. Я думаю, что это NPE брошено. Когда вы пытаетесь установить текст на TextView
, Попробуйте создать экземпляр TextView
в пределах handleMessage()
метод:
Handler cambiarHandler = new Handler() {
public void handleMessage(android.os.Message msg) {
texto = (TextView) findViewById(R.id.texto);
texto.setText("ok");
}
};
И в методе onClick сделайте это, чтобы каждый раз при каждом нажатии кнопки создавался новый экземпляр потока.
public void onClick(View v){
new Thread (new Runnable() {
public void run() {
try {
Thread.sleep(3000);
cambiarHandler.sendEmptyMessage(0);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}).start();
}