2

現在の時刻を表示する Android アプリケーションを作成しようとしています。タイマーを使用してアクティビティの時間を更新したいのですが、TextView が更新されていないため、常に画面に表示されるのは 1 回だけです。これが私のコードです:

package com.example.androidtemp;

import java.sql.Date;
import java.text.SimpleDateFormat;
import java.util.Timer;
import java.util.TimerTask;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
import com.example.androidtemp.R;

public class ActivityTime extends Activity
{
    SimpleDateFormat sdf;
    String time;
    TextView tvTime;
    String TAG = "States";

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_activity_time);

        sdf = new SimpleDateFormat("HH:mm:ss");
        time = sdf.format(new Date(System.currentTimeMillis()));

        tvTime = (TextView) findViewById(R.id.tvTime);

        Timer timer = new Timer();
        TimerTask task = new TimerTask()
        {
            @Override
            public void run()
            {
                // TODO Auto-generated method stub
                timerMethod();
            }
        };

        try
        {
            timer.schedule(task, 0, 1000);
        } 
        catch (IllegalStateException e)
        {
            // TODO: handle exception
            e.printStackTrace();
            Log.e(TAG, "The Timer has been canceled, or if the task has been scheduled or canceled.");
        }
    }

    protected void timerMethod()
    {
        // TODO Auto-generated method stub
        this.runOnUiThread(changeTime);
    }

    private  final Runnable changeTime = new Runnable()
    {
        public void run()
        {
            // TODO Auto-generated method stub
            //Log.d(TAG, "Changing time.");
            sdf.format(new Date(System.currentTimeMillis()));
            tvTime.setText(time);
        }
    };
}

誰でもこの問題の解決策を持っていますか?

4

2 に答える 2

0

時間を表示するだけの場合は、DigitalClock または TextClock を使用することをお勧めします (レイアウト xml およびレイアウト / layout-v17 で「include」を使用して、OS のバージョンに応じて異なるコンポーネントを使用できます)。

さらに制御したい場合は、Timer の代わりに Handler または ExecutorService を使用することをお勧めします。JavaタイマーとExecutorService?

コードをそのまま修正したい場合は、変数「time」の値を変更するだけです;)

于 2012-12-09T19:21:32.107 に答える
0

アプリケーションのビューにアクセスできるため、ハンドラーを使用します。アプリケーションのビューは既にメイン スレッドに属しているため、別のスレッドを作成してアクセスすることは通常は機能しません。間違っていなければ、ハンドラーはメッセージを使用してメイン スレッドとそのコンポーネントと通信します。代わりに、スレッド定義がある場所でこれを使用します。

Handler  handler = new Handler();
handler.removeCallbacks(runnable);
handler.postDelayed(runnable, 1000);

これを実行可能な定義に追加します

handler.postDelayed(runnable, 1000);

この最後のステートメントは、新しい on が追加されたときに、実行を待っている runnable のインスタンスをすべて削除します。キューをクリアするようなものです。

于 2012-12-09T18:56:36.023 に答える