7
int delay = 1000; // delay for 1 sec. 
int period = 10000; // repeat every 10 sec. 
Timer timer = new Timer(); 
timer.scheduleAtFixedRate(new TimerTask() 
    { 
        public void run() 
        { 
            displayData();  // display the data
        } 
    }, delay, period);  

その他:

while(needToDisplayData)
{
    displayData(); // display the data
    Thread.sleep(10000); // sleep for 10 seconds
}   

どちらも機能しません (アプリケーションは強制終了されます)。他にどのようなオプションを試すことができますか?

4

5 に答える 5

27

バックグラウンド スレッドでスリープを実行するため、コードは失敗しますが、表示データは UI スレッドで実行する必要があります。

runOnUiThread(Runnable) から displayData を実行するか、ハンドラーを定義してメッセージを送信する必要があります。

例えば:

(new Thread(new Runnable()
        {

            @Override
            public void run()
            {
                while (!Thread.interrupted())
                    try
                    {
                        Thread.sleep(1000);
                        runOnUiThread(new Runnable() // start actions in UI thread
                        {

                            @Override
                            public void run()
                            {
                                displayData(); // this action have to be in UI thread
                            }
                        });
                    }
                    catch (InterruptedException e)
                    {
                        // ooops
                    }
            }
        })).start(); // the while thread will start in BG thread
于 2012-07-27T11:50:51.280 に答える
9

ViewまたはHandleronPostDelayed()のいずれかからアクセスして使用します。や newを作成しないことで、メモリを節約できます。TimerThread

private final Handler mHandler = new Handler();

private final Runnable mUpdateUI = new Runnable() {
    public void run() {
        displayData();
        mHandler.postDelayed(mUpdateUI, 1000); // 1 second
        }
    }
};

mHandler.post(mUpdateUI);
于 2012-07-27T12:01:24.177 に答える
1

これを試して :

@Override                    
    public void run() {   
            TextView tv1 = (TextView) findViewById(R.id.tv);
            while(true){
               showTime(tv1);                                                                
               try {
                   Thread.sleep(1000);
               }catch (Exception e) {
                   tv1.setText(e.toString());
               }           
            } 
    }       

Uもこれを試すことができます

特定の時間間隔で UI を更新するために使用できる別の方法もあります。上記の 2 つのオプションは正しいですが、特定の時間間隔で UI を更新する別の方法を使用できる状況によって異なります。

以下のように、スレッドから UI コントロールを更新するために、最初に Handler の 1 つのグローバル変数を宣言します。

ハンドラー mHandler = new Handler(); スレッドを 1 つ作成し、while ループを使用して、スレッドのスリープ メソッドを使用して定期的にタスクを実行します。

new Thread(new Runnable() {
        @Override
        public void run() {
            // TODO Auto-generated method stub
            while (true) {
                try {
                    Thread.sleep(10000);
                    mHandler.post(new Runnable() {

                        @Override
                        public void run() {
                            // TODO Auto-generated method stub
                            // Write your code here to update the UI.
                        }
                    });
                } catch (Exception e) {
                    // TODO: handle exception
                }
            }
        }
    }).start();
于 2012-07-27T11:47:56.080 に答える
0

あなたがしたいくつかの間違いがあります:

  1. メインスレッドで Thread.sleep() を呼び出すべきではありません (また、長時間ブロックするべきではありません)。メイン スレッドが 5 秒以上ブロックされると、ANR (アプリケーションが応答しない) が発生し、強制的に閉じられます。

  2. Android でタイマーを使用することは避けてください。代わりに Handler を試してください。ハンドラーの良い点は、メインスレッドで作成されることです->ビューにアクセスできます(ビューにアクセスできない独自のスレッドで実行されるタイマーとは異なります)。

    class MyActivity extends Activity {
    
        private static final int DISPLAY_DATA = 1;
        // this handler will receive a delayed message
        private Handler mHandler = new Handler() {
            @Override
            void handleMessage(Message msg) {
                if (msg.what == DISPLAY_DATA) displayData();
            }
         };
    
         @Override
         void onCreate(Bundle b) {
             //this will post a message to the mHandler, which mHandler will get
             //after 5 seconds
             mHandler.postEmptyMessageDelayed(DISPLAY_DATA, 5000);
         }
     } 
    
于 2012-07-27T12:15:16.090 に答える