Timer in three EditTexts not working properly

2019-08-23 09:11发布

问题:

I have made a Timer Application in android.In application there are three (uneditable)EditText and a Button.When i press Button first time the timer in 1st EditText will start ,when i press it 2nd time the timer in 1st EditText will stop and at the same time the timer in 2nd EditText will be start,when i again press button same thing will be happened with 3rd EdtiText.NOw this code is working properly but when i press back button and again start it,its stopped working in 3rd EditText.The problem is sometimes the timer in 3rd EditText is not working(not displayed)..my code is as below:

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>

Please help me for this as fast ...really thanking you.....hav a gud tym

回答1:

Look at this code in your lap2 handler:

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

You schedule a task and cancel the timer immediately afterwards.

I would suggest that you get rid of the Timer and just use the Handler.postDelayed() method, as you have done already for the time updates and to start the update of the first field:

h2.postDelayed(run, 0);

Use the same method to start the updates for second and third fields. You don't need the Timer and TimerTask instances at all.

Also, why do you need two handlers (handler, and h2)?