0

問題は、ボタンを2回クリックするとアプリケーションがクラッシュし、その理由がわからないことです。2回目のボタンのクリックは、もう一度同じだと思います。

どんな助けでも大歓迎です。

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");  

        }
    };


}
4

3 に答える 3

4

私が見る問題は、スレッドが一度実行されるように設計されていることです。スレッドを実行するたびに、スレッドの新しいインスタンスを作成する必要があります。

于 2011-08-11T21:36:34.493 に答える
0

これは、UI スレッドのみが UI を変更できるようにするという Android のポリシーに関係している可能性があります。

別のスレッドから UI を変更する場合は、代わりに ASyncTask を使用する必要があります。

ここを参照してください:

スレッドから UI を更新する

于 2011-08-11T21:38:29.730 に答える
0

どの例外がスローされるかわかりません。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();
}
于 2011-08-11T21:40:57.473 に答える