当前位置: 代码迷 >> Android >> Android实现计时与记时(限时抢购)的几种方法(线程)
  详细解决方案

Android实现计时与记时(限时抢购)的几种方法(线程)

热度:480   发布时间:2016-04-28 06:38:30.0
Android实现计时与倒计时(限时抢购)的几种方法(线程)

方法一
Timer与TimerTask(Java实现)

[java] view plaincopy
public class timerTask extends Activity{???
??
??? private int recLen = 11;???
??? private TextView txtView;???
??? Timer timer = new Timer();???
??
??? public void onCreate(Bundle savedInstanceState){???
??????? super.onCreate(savedInstanceState);???
???????????
??????? setContentView(R.layout.timertask);???
??????? txtView = (TextView)findViewById(R.id.txttime);???
???????????
??????? timer.schedule(task, 1000, 1000);?????? // timeTask???
??? }??????
??
??? TimerTask task = new TimerTask() {???
??????? @Override???
??????? public void run() {???
??
??????????? runOnUiThread(new Runnable() {????? // UI thread???
??????????????? @Override???
??????????????? public void run() {???
??????????????????? recLen--;???
??????????????????? txtView.setText(""+recLen);???
??????????????????? if(recLen < 0){???
??????????????????????? timer.cancel();???
??????????????????????? txtView.setVisibility(View.GONE);???
??????????????????? }???
??????????????? }???
??????????? });???
??????? }???
??? };???
}???


方法二
TimerTask与Handler(不用Timer的改进型)

public class timerTask extends Activity{???
??? private int recLen = 11;???
??? private TextView txtView;???
??? Timer timer = new Timer();???
??
??? public void onCreate(Bundle savedInstanceState){???
??????? super.onCreate(savedInstanceState);???
??
??????? setContentView(R.layout.timertask);???
??????? txtView = (TextView)findViewById(R.id.txttime);???
??
??????? timer.schedule(task, 1000, 1000);?????? // timeTask???
??? }??????
??
??? final Handler handler = new Handler(){???
??????? @Override???
??????? public void handleMessage(Message msg){???
??????????? switch (msg.what) {???
??????????? case 1:???
??????????????? txtView.setText(""+recLen);???
??????????????? if(recLen < 0){???
??????????????????? timer.cancel();???
??????????????????? txtView.setVisibility(View.GONE);???
??????????????? }???
??????????? }???
??????? }???
??? };???
??
??? TimerTask task = new TimerTask() {???
??????? @Override???
??????? public void run() {???
??????????? recLen--;???
??????????? Message message = new Message();???
??????????? message.what = 1;???
??????????? handler.sendMessage(message);???
??????? }???
??? };???
}???


方法三

Handler与Message(不用TimerTask)?
?
public class timerTask extends Activity{???
??? private int recLen = 11;???
??? private TextView txtView;???
??
??? public void onCreate(Bundle savedInstanceState) {?????
??????? super.onCreate(savedInstanceState);?????
??
??????? setContentView(R.layout.timertask);????
??????? txtView = (TextView)findViewById(R.id.txttime);???
??
??????? Message message = handler.obtainMessage(1);???? // Message???
??????? handler.sendMessageDelayed(message, 1000);???
??? }?????
??
??? final Handler handler = new Handler(){???
??
??????? public void handleMessage(Message msg){???????? // handle message???
??????????? switch (msg.what) {???
??????????? case 1:???
??????????????? recLen--;???
??????????????? txtView.setText("" + recLen);???
??
??????????????? if(recLen > 0){???
??????????????????? Message message = handler.obtainMessage(1);???
??????????????????? handler.sendMessageDelayed(message, 1000);????? // send message???
??????????????? }else{???
??????????????????? txtView.setVisibility(View.GONE);???
??????????????? }???
??????????? }???
??
??????????? super.handleMessage(msg);???
??????? }???
??? };???
}???

?

方法四
Handler与Thread(不占用UI线程)

public class timerTask extends Activity{???
??? private int recLen = 0;???
??? private TextView txtView;???
??
??? public void onCreate(Bundle savedInstanceState){???
??????? super.onCreate(savedInstanceState);???
??
??????? setContentView(R.layout.timertask);???
??????? txtView = (TextView)findViewById(R.id.txttime);???
???????????
??????? new Thread(new MyThread()).start();???????? // start thread???
??? }??????
??
??? final Handler handler = new Handler(){????????? // handle???
??????? public void handleMessage(Message msg){???
??????????? switch (msg.what) {???
??????????? case 1:???
??????????????? recLen++;???
??????????????? txtView.setText("" + recLen);???
??????????? }???
??????????? super.handleMessage(msg);???
??????? }???
??? };???
??
??? public class MyThread implements Runnable{????? // thread???
??????? @Override???
??????? public void run(){???
??????????? while(true){???
??????????????? try{???
??????????????????? Thread.sleep(1000);???? // sleep 1000ms???
??????????????????? Message message = new Message();???
??????????????????? message.what = 1;???
??????????????????? handler.sendMessage(message);???
??????????????? }catch (Exception e) {???
??????????????? }???
????

方法五
Handler与Runnable(最简单型)???
?
public class timerTask extends Activity{???
??? private int recLen = 0;???
??? private TextView txtView;???
??
??? public void onCreate(Bundle savedInstanceState){???
??????? super.onCreate(savedInstanceState);???
??
??????? setContentView(R.layout.timertask);???
??????? txtView = (TextView)findViewById(R.id.txttime);???
??????? runnable.run();??
??? }??????
??
??? Handler handler = new Handler();???
??? Runnable runnable = new Runnable() {???
??????? @Override???
??????? public void run() {???
??????????? recLen++;???
??????????? txtView.setText("" + recLen);???
??????????? handler.postDelayed(this, 1000);???
??????? }???
??? };???
}???

计时与倒计时
?方法1,方法2和方法3,都是倒计时
?方法4,方法5,都是计时
?计时和倒计时,都可使用上述方法实现(代码稍加改动)

UI线程比较
?方法1,方法2和方法3,都是在UI线程实现的计时;
?方法4和方法5,是另开Runnable线程实现计时

?实现方式比较
?方法1,采用的是Java实现,即Timer和TimerTask方式;
?其它四种方法,都采用了Handler消息处理

?推荐使用
?如果对UI线程交互要求不很高,可以选择方法2和方法3
如果考虑到UI线程阻塞,严重影响到用户体验,推荐使用方法4,另起线程单独用于计时和其它的逻辑处理

方法5,综合了前几种方法的优点,是最简的

  相关解决方案