Я пытаюсь сделать простой поток, который меняет текстовое представление через некоторое время

Проблема в том, что, когда я нажимаю кнопку на секунду, мое приложение падает, и я не понимаю, почему. Когда я щелкаю кнопку во второй раз, предполагается, что снова и снова.

Любая помощь приветствуется.

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();
}
Другие вопросы по тегам