繁体   English   中英

停止并启动线程Android

[英]Stop and Start a thread Android

我正在尝试一个EditText,它会随着经过的时间不断更新。 这是由线程处理的,该线程调用一种方法来计算经过时间并将EditText文本设置为经过时间。 线程每秒休眠一次。 该线程在用户按下“开始”时启动,并在用户按下“停止”时停止。 当用户再次按下“开始”时,线程应从0重新开始(因为重新设置了开始时间)。 这是代码:

public class MainActivity extends AppCompatActivity {

    public Date start;
    public Date end;

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

        Button startButton = (Button) findViewById(R.id.startButton);
        Button endButton = (Button) findViewById(R.id.stopButton);
        final EditText dateEditText = (EditText) findViewById(R.id.dateEditText) ;
        final EditText hoursEditText = (EditText) findViewById(R.id.hoursEditText); //the one I want to update

        final DateFormat df = new SimpleDateFormat("MM/dd/yy");

        final Thread t = new Thread() {

            @Override
            public void run() {
                try {
                    while (!isInterrupted()) {
                        Thread.sleep(1000);
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                setTimeElapsed(hoursEditText);
                            }
                        });

                    }
                } catch (InterruptedException e) {

                }
            }
        };

        startButton.setOnClickListener(new View.OnClickListener(){
            public void onClick(View v){
                start = new Date();
                dateEditText.setText(df.format(start));
                hoursEditText.setText("");
                t.start();
            }
        });


        endButton.setOnClickListener(new View.OnClickListener(){
            public void onClick(View v){
                t.interrupt();
                if (start == null) {
                    //write error message
                }
                else {
                    setTimeElapsed(hoursEditText);
                    start = null;
                }
            }
        });



    }

    public void setTimeElapsed(EditText hoursEditText)
    {
        end = new Date();
        long diff = end.getTime() - start.getTime();
        String diffFormatted = String.format("%02d:%02d:%02d",
                TimeUnit.MILLISECONDS.toHours(diff),
                TimeUnit.MILLISECONDS.toMinutes(diff)
                        - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(diff)),
                TimeUnit.MILLISECONDS.toSeconds(diff)
                        - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(diff)));

        hoursEditText.setText(diffFormatted);
    }
}

如您所见,问题在于当我按下“停止”然后再次按下“启动”时,该应用程序将引发错误,因为该线程已经在运行。 如果我没有interrupt语句,则该应用程序崩溃,因为它认为start为null。 我只想在按下停止按钮时停止线程,并在按下开始按钮时从0开始计数。

编辑:

解决这个问题的一种方法是拥有一个创建新线程的方法,并在我的startButton侦听器中调用该方法

public void startThread(final EditText hoursEditText){
        t = new Thread() {

            @Override
            public void run() {
                try {
                    while (!isInterrupted()) {
                        Thread.sleep(1000);
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                setTimeElapsed(hoursEditText);
                            }
                        });

                    }
                } catch (InterruptedException e) {

                }
            }
        };

        t.start();
    }

但这每次有人按下开始都会创建一个新线程。 这不好。

您可以使用处理程序

 Handler handler = new Handler();
 final Thread thread = new Thread(new Runnable() {
        @Override
        public void run() {
            setTimeElapsed(hoursEditText);
            handler.postDelayed(this, 100);
        }
    });

//在结束按钮上单击,您可以删除处理程序回调

endButton.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                if(handler != null)
                handler.removeCallbacksAndMessages(null);
            }
        });

完整的代码

import android.os.Bundle;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.TimeUnit;

public class MainActivity extends AppCompatActivity {

    public Date start;
    public Date end;
    Handler handler = new Handler();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button startButton = (Button) findViewById(R.id.startButton);
        Button endButton = (Button) findViewById(R.id.stopButton);
        final EditText dateEditText = (EditText) findViewById(R.id.dateEditText);
        final EditText hoursEditText = (EditText) findViewById(R.id.hoursEditText); //the one I want to update

        final DateFormat df = new SimpleDateFormat("MM/dd/yy");

        final Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                setTimeElapsed(hoursEditText);
                handler.postDelayed(this, 100);
            }
        });

        startButton.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                start = new Date();
                dateEditText.setText(df.format(start));
                hoursEditText.setText("");
                handler.post(thread);
            }
        });


        endButton.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                if(handler != null)
                handler.removeCallbacksAndMessages(null);
            }
        });


    }

    public void setTimeElapsed(EditText hoursEditText) {
        end = new Date();
        long diff = end.getTime() - start.getTime();
        String diffFormatted = String.format("%02d:%02d:%02d",
                TimeUnit.MILLISECONDS.toHours(diff),
                TimeUnit.MILLISECONDS.toMinutes(diff)
                        - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(diff)),
                TimeUnit.MILLISECONDS.toSeconds(diff)
                        - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(diff)));

        hoursEditText.setText(diffFormatted);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM