1

私はボタンを持っています。このボタンをクリックすると、いくつかのアクションを実行して元に戻したいと思います.5秒と言います。たとえば、ボタン A がクリックされると、TextA.Text が 5 秒間「Clicked」になり、5 秒後にテキストの値が元に戻るはずです。ここに私が持っているものがありますが、それは完全に間違っていると感じています。遅延するコード:

diff=time2-time1;

            while (diff<5000) {
                //Log.d("Timer is", String.valueOf(diff));
                time2=System.currentTimeMillis();
                diff=time2-time1;
            }

そのため、ループがシミュレートされた後、私がやりたいことを実行するまでループが機能します。何かアドバイス?

4

6 に答える 6

7

次のようなハンドラーを使用します。

new Handler().postDelayed(new Runnable() {
    void run() {
        // do something later
    }
}, 5000);

編集:このソリューションでは、遅延中もメインスレッドを続行できることに注意してください。GUIの更新、アクティビティの変更([ホーム]ボタンなど)の適切な処理などです。使用Thread.sleep()はできません。

于 2012-05-30T04:50:09.633 に答える
2

あなたはそれをする方法を持っています:

Thread.sleep(5000)

InterruptedExceptionをスローする可能性があるため、キャッチする必要があります。

于 2012-05-30T04:49:25.167 に答える
2

ビジーループは悪い考えです-それはあなたのバッテリーを生きたまま食べます。おそらくThread.sleepもっとうまくいくでしょう。

于 2012-05-30T04:50:20.973 に答える
1

このコードを試してください、

// First save the current value of Textbox in a variable 
String tmpVal = myEditText.getText();
// Now Setting of new Value for 2 seconds 
myEditText.setText ( "Clicked" );
// Sleeping for 5 seconds
try
{
     Thread.sleep(5000);
}
//Now Returning back to your old value
myEditText.setText ( tmpVal );

上記のすべてのコードはpublic void onClick(View v)メソッドに入ります。

于 2012-05-30T04:52:08.497 に答える
1

Onclickでビューを取得し、使用することができます

@Override
public void onClick(final View v) {
    if(v.getId() == R.id.button1) {

    if(isClikcalbe ){
isClikcalbe  = false;
      view.postDelayed(new Runnable() {

            @Override
            public void run() {

                // you code 
                 isClikcalbe = true;
            }
        }, 5000);
   }

    }
}

bollean isClikcalbeを使用して、使用できなくなるまで新しいクリックを停止することもできます

于 2012-05-30T04:56:09.100 に答える
0

AsyncTasksを仕事をするコンテナとして検討することをお勧めします。さらに、その中でThread.sleepを呼び出すことができます。ジョブが完了したら、Handlerオブジェクトにキャプションを変更するように依頼できます。

メインスレッドをスリープ状態にする代わりにAsyncTaskで実行する理由は、アプリケーションが「フリーズ」しないためです。使用方法は次のとおりです。

private class AsyncHttpRequest extends AsyncTask<Void, Void, Void>{
        @Override
        protected Void doInBackground(Void... params) {
            Thread.sleep(5000);
            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            _jobHandler.sendEmptyMessage(0);
        }
    }

protected Handler _jobHandler = new Handler() {
        @Override
        public void dispatchMessage(Message msg) {
            // set the caption here
        }
    };
于 2012-05-30T04:55:01.393 に答える