三个EditTexts中的计时器无法正常工作

时间:2013-01-01 06:01:44

标签: android timer timertask

enter image description here我在android.In应用程序中创建了一个Timer应用程序,有三个(不可编辑的)EditText和一个Button。当我第一次按Button时在第1 EditText开始,当我第二次按下它时,第一EditText中的计时器将停止,同时第二EditText中的计时器将开始,当我再次按下按钮时同样的事情将发生在第3 EdtiText。否则这个代码工作正常但是当我按下后退按钮再次启动它时,它停止在第3 EditText个工作。问题有时是第3个EditText中的计时器不工作(不显示)..我的代码如下:

mainActivity.java

package com.example.timerdemo2;

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

import org.w3c.dom.Text;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends Activity {
    EditText et1,et2,et3;
    TextView tv;
   public int i=0;
    long starttime = 0;
    long lasttime,lasttime1;
    final Handler handler = new Handler();
    Handler h2 = new Handler();
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            moveTaskToBack(true);
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }
    Runnable run = new Runnable() {

        @Override
        public void run() {
            // TODO Auto-generated method stub
            long millis = System.currentTimeMillis() - starttime;
               int seconds = (int) (millis / 1000);
               int minutes = (seconds%3600)/60;
               int hours = seconds / 3600;
               seconds     = seconds % 60;

               et1.setText(String.format("%02d:%02d:%02d",hours, minutes, seconds));
     //          et2.setText(String.format("%02d:%02d:%02d",hours, minutes, seconds));
      //         et3.setText(String.format("%02d:%02d:%02d",hours, minutes, seconds));

               h2.postDelayed(this, 500);
        }
    };

    class firstTask extends TimerTask {

        public void run() {
            handler.sendEmptyMessage(0);
        }
};  

class secondTask extends TimerTask{

    @Override
    public void run() {
        // TODO Auto-generated method stub
        MainActivity.this.runOnUiThread(new Runnable() {

            @Override
            public void run() {

                // TODO Auto-generated method stub
                long millis = System.currentTimeMillis() - starttime;
                int seconds = (int)(millis/1000);
                int hours =seconds/3600;
                int minutes = (seconds % 3600)/60;
                seconds = seconds % 60;
                et2.setText(String.format("%02d:%02d:%02d", hours,minutes,seconds));

            }
        });
    }

}

class thirdTask extends TimerTask{

    @Override
    public void run() {
        // TODO Auto-generated method stub
        MainActivity.this.runOnUiThread(new Runnable() {

            @Override
            public void run() {
                // TODO Auto-generated method stub

                 long millis = System.currentTimeMillis() - starttime;
                 int seconds = (int)(millis/1000);
                 int hours =seconds/3600;
                 int minutes = (seconds % 3600)/60;
                 seconds = seconds % 60;

                 et3.setText(String.format("%02d:%02d:%02d", hours,minutes,seconds));
                 h2.postDelayed(this, 500);
            }
        });
    }

}
    Timer timer = new Timer();

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Bundle bundle = this.getIntent().getExtras();
        String title = bundle.getString("title");
        tv = (TextView)findViewById(R.id.projectTitle);
        tv.setText(title);

        et1= (EditText)findViewById(R.id.timeEdit1);
        et2= (EditText)findViewById(R.id.timeEdit2);
        et3= (EditText)findViewById(R.id.timeEdit3);
        Button b = (Button)findViewById(R.id.btn);
        b.setText("Start");
        b.setOnClickListener(new OnClickListener() {

        public void onClick(View v) {
            // TODO Auto-generated method stub
        Button b =(Button)v;

        if(b.getText().equals("Stop")){
            timer.cancel();
            timer.purge();
            h2.removeCallbacks(run);
            Intent intent =new Intent(MainActivity.this,Timedetails.class);
            Bundle bundle =new Bundle();

            //Procedure for Showing time stamps on another page

            String a = et1.getText().toString();
            String b1 = et2.getText().toString();
            String c = et3.getText().toString();

            String t =  tv.getText().toString();
            intent.putExtra("titl1",t);
            startActivity(intent);

             SimpleDateFormat format = new SimpleDateFormat("hh:mm:ss");
             format.setTimeZone(TimeZone.getTimeZone("UTC"));
           try{
               bundle.putString("t1", a);
                bundle.putString("t2", b1);
                bundle.putString("t3", c);
                 Date date1 = (Date) format.parse(a);
                 Date date2 = (Date) format.parse(b1);
                 Date date3 = (Date) format.parse(c);
                 //time difference in milliseconds
                 long timeDiff = date2.getTime() - date1.getTime(); 
                 long timeDiff2 = date3.getTime() - date2.getTime();
                 //new date object with time difference
                 Date diffDate = new Date(timeDiff); 

                Date diffDate2 = new Date(timeDiff2);
                 long timeDiffSecs = timeDiff/1000;
                 String timeDiffString = timeDiffSecs/3600+":"+
                                         (timeDiffSecs%3600)/60+":"+
                                         (timeDiffSecs%3600)%60;
                 long timeDiffSecs1 = timeDiff2/1000;
                 String timeDiffString1 = timeDiffSecs1/3600+":"+
                                         (timeDiffSecs1%3600)/60+":"+
                                         (timeDiffSecs1%3600)%60;
                 //formatted date string
                // String timeDiffString = format.format(diffDate); 
                 //System.out.println("Time Diff = "+ timeDiffString );
                 bundle.putString("t1", a);
                    bundle.putString("t2", b1);
                    bundle.putString("t3", c);
         bundle.putString("dif1", timeDiffString);
         bundle.putString("dif2", timeDiffString1);
           }
           catch(Exception e){
               e.printStackTrace();
           }


            intent.putExtras(bundle);
            startActivity(intent);
            b.setText("Next");

        }



        else if(b.getText().equals("Lap1")) 
        {

            timer.schedule(new secondTask(),0, 500);
            h2.removeCallbacks(run);
            b.setText("lap2");
        }
        else if(b.getText().equals("lap2")){

            timer.schedule(new thirdTask(), 0,500);
            h2.removeCallbacks(run);
            timer.cancel();
            timer.purge();
            b.setText("Stop");
        }
        else {
            starttime = System.currentTimeMillis();
            timer = new Timer();
            timer.schedule(new firstTask(), 0,500);
           // timer.schedule(new secondTask(),  0,500);
            //timer.schedule(new thirdTask(),  0,500);
            h2.postDelayed(run, 0);
            b.setText("Lap1");           
           //long lastdown = System.currentTimeMillis();
        }

        }
    });  
    }


}

MainActivity.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/abs5"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/projectTitle"
       android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="top|center"
        android:layout_marginTop="5dp"
        android:text="Project Title"
        android:textColor="#CCCCCC"
        android:textSize= "40dp"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:textStyle="bold"  />

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="10dp"
    android:orientation="horizontal" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="5dp"
        android:layout_marginTop="10dp"
        android:text="Timing Point1"
       android:textSize="20dp"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:textColor="#CCCCCC" />

    <EditText
        android:id="@+id/timeEdit1"
        android:layout_width="172dp"
        android:layout_height="30dp"
        android:layout_marginLeft="5dp"
        android:layout_marginTop="10dp"
        android:background="#FFFFFF"
        android:editable="false"
        android:filterTouchesWhenObscured="false"
        android:focusable="false" />

</LinearLayout>

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal" 

    android:layout_marginTop="10dp">

    <TextView

        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Timing Point2"
        android:textColor="#CCCCCC"
        android:textSize="20dp"
        android:layout_marginTop="10dp"
         android:layout_marginLeft="5dp"
        android:textAppearance="?android:attr/textAppearanceMedium" />

     <EditText
         android:id="@+id/timeEdit2"
         android:layout_width="172dp"
        android:layout_height="30dp"
         android:layout_marginLeft="5dp"
         android:layout_marginTop="10dp"
           android:focusable="false"
        android:filterTouchesWhenObscured="false"
         android:background="#FFFFFF"
         android:editable="false" />

</LinearLayout>

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="10dp"

    android:orientation="horizontal" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="5dp"
        android:layout_marginTop="10dp"
        android:text="Timing Point3"
        android:textColor="#CCCCCC"
        android:textSize="20dp"
        android:textAppearance="?android:attr/textAppearanceMedium" />

    <EditText
        android:id="@+id/timeEdit3"
        android:layout_width="172dp"
       android:layout_height="30dp"
        android:layout_marginLeft="5dp"
        android:layout_marginTop="10dp"
        android:background="#FFFFFF"
        android:editable="false" >

        <requestFocus />
    </EditText>

    </LinearLayout>

 <LinearLayout
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:layout_marginTop="10dp"
     android:layout_marginBottom="20dp"
     android:orientation="horizontal" >

     <Button
         android:id="@+id/btn"
         android:layout_width="129dp"
         android:layout_height="64dp"
         android:layout_marginBottom="10dp"
         android:layout_marginLeft="110dp"
         android:layout_marginTop="10dp"
         android:background="@drawable/aqa"
         android:textColor="#FFFFFF"
         android:textSize="30dp" />

 </LinearLayout>

</LinearLayout>

请快速帮助我...真的感谢你......有一个gud tym

In my image the 3rd timer in not working sometimes after installing it on the device.

1 个答案:

答案 0 :(得分:1)

在你的lap2处理程序中查看这段代码:

        timer.schedule(new thirdTask(), 0,500);
        h2.removeCallbacks(run);
        timer.cancel();
        timer.purge();
        b.setText("Stop");

您计划任务并在之后立即取消计时器。

我建议您删除Timer并使用Handler.postDelayed()方法,因为您已经完成了时间更新并开始更新第一个字段:

h2.postDelayed(run, 0);

使用相同的方法启动第二个和第三个字段的更新。您根本不需要TimerTimerTask个实例。

另外,为什么需要两个处理程序(handlerh2)?