有人可以举一个每秒左右更新文本字段的简单示例吗?

我想制作一个飞行球,需要每秒计算/更新球坐标,这就是为什么我需要某种计时器。

我没有从 here 得到任何信息.

请您参考如下方法:

好的,因为这个问题还没有解决,有 3 种简单的方法来处理这个问题。 下面是一个显示所有 3 种方法的示例,底部的示例仅显示了我认为更好的方法。还要记住在 onPause 中清理任务,必要时保存状态。

 
import java.util.Timer; 
import java.util.TimerTask; 
import android.app.Activity; 
import android.os.Bundle; 
import android.os.Handler; 
import android.os.Message; 
import android.os.Handler.Callback; 
import android.view.View; 
import android.widget.Button; 
import android.widget.TextView; 
 
public class main extends Activity { 
    TextView text, text2, text3; 
    long starttime = 0; 
    //this  posts a message to the main thread from our timertask 
    //and updates the textfield 
   final Handler h = new Handler(new Callback() { 
 
        @Override 
        public boolean handleMessage(Message msg) { 
           long millis = System.currentTimeMillis() - starttime; 
           int seconds = (int) (millis / 1000); 
           int minutes = seconds / 60; 
           seconds     = seconds % 60; 
 
           text.setText(String.format("%d:%02d", minutes, seconds)); 
            return false; 
        } 
    }); 
   //runs without timer be reposting self 
   Handler h2 = new Handler(); 
   Runnable run = new Runnable() { 
 
        @Override 
        public void run() { 
           long millis = System.currentTimeMillis() - starttime; 
           int seconds = (int) (millis / 1000); 
           int minutes = seconds / 60; 
           seconds     = seconds % 60; 
 
           text3.setText(String.format("%d:%02d", minutes, seconds)); 
 
           h2.postDelayed(this, 500); 
        } 
    }; 
 
   //tells handler to send a message 
   class firstTask extends TimerTask { 
 
        @Override 
        public void run() { 
            h.sendEmptyMessage(0); 
        } 
   }; 
 
   //tells activity to run on ui thread 
   class secondTask extends TimerTask { 
 
        @Override 
        public void run() { 
            main.this.runOnUiThread(new Runnable() { 
 
                @Override 
                public void run() { 
                   long millis = System.currentTimeMillis() - starttime; 
                   int seconds = (int) (millis / 1000); 
                   int minutes = seconds / 60; 
                   seconds     = seconds % 60; 
 
                   text2.setText(String.format("%d:%02d", minutes, seconds)); 
                } 
            }); 
        } 
   }; 
 
 
   Timer timer = new Timer(); 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.main); 
 
        text = (TextView)findViewById(R.id.text); 
        text2 = (TextView)findViewById(R.id.text2); 
        text3 = (TextView)findViewById(R.id.text3); 
 
        Button b = (Button)findViewById(R.id.button); 
        b.setText("start"); 
        b.setOnClickListener(new View.OnClickListener() { 
 
            @Override 
            public void onClick(View v) { 
                Button b = (Button)v; 
                if(b.getText().equals("stop")){ 
                    timer.cancel(); 
                    timer.purge(); 
                    h2.removeCallbacks(run); 
                    b.setText("start"); 
                }else{ 
                    starttime = System.currentTimeMillis(); 
                    timer = new Timer(); 
                    timer.schedule(new firstTask(), 0,500); 
                    timer.schedule(new secondTask(),  0,500); 
                    h2.postDelayed(run, 0); 
                    b.setText("stop"); 
                } 
            } 
        }); 
    } 
 
    @Override 
    public void onPause() { 
        super.onPause(); 
        timer.cancel(); 
        timer.purge(); 
        h2.removeCallbacks(run); 
        Button b = (Button)findViewById(R.id.button); 
        b.setText("start"); 
    } 
} 
 
 

要记住的主要事情是 UI 只能从主 ui 线程修改,因此请使用处理程序或 Activity.runOnUIThread(Runnable r);

这是我认为的首选方法。

 
import android.app.Activity; 
import android.os.Bundle; 
import android.os.Handler; 
import android.view.View; 
import android.widget.Button; 
import android.widget.TextView; 
 
public class TestActivity extends Activity { 
 
    TextView timerTextView; 
    long startTime = 0; 
 
    //runs without a timer by reposting this handler at the end of the runnable 
    Handler timerHandler = new Handler(); 
    Runnable timerRunnable = new Runnable() { 
 
        @Override 
        public void run() { 
            long millis = System.currentTimeMillis() - startTime; 
            int seconds = (int) (millis / 1000); 
            int minutes = seconds / 60; 
            seconds = seconds % 60; 
 
            timerTextView.setText(String.format("%d:%02d", minutes, seconds)); 
 
            timerHandler.postDelayed(this, 500); 
        } 
    }; 
 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.test_activity); 
 
        timerTextView = (TextView) findViewById(R.id.timerTextView); 
 
        Button b = (Button) findViewById(R.id.button); 
        b.setText("start"); 
        b.setOnClickListener(new View.OnClickListener() { 
 
            @Override 
            public void onClick(View v) { 
                Button b = (Button) v; 
                if (b.getText().equals("stop")) { 
                    timerHandler.removeCallbacks(timerRunnable); 
                    b.setText("start"); 
                } else { 
                    startTime = System.currentTimeMillis(); 
                    timerHandler.postDelayed(timerRunnable, 0); 
                    b.setText("stop"); 
                } 
            } 
        }); 
    } 
 
  @Override 
    public void onPause() { 
        super.onPause(); 
        timerHandler.removeCallbacks(timerRunnable); 
        Button b = (Button)findViewById(R.id.button); 
        b.setText("start"); 
    } 
 
} 
 
 


评论关闭
IT干货网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!