安卓:简单的计时器计时器、简单

2023-09-06 02:49:01 作者:只為你傾心

我有一个TextView的和两个按钮的简单程序:Button1的和将Button2

点击按钮1将启动计数器,1每隔1秒,并显示结果对TextView的增加;揿按按钮2将停止。这里是我的code为Button1的一部分。但是,这是行不通的。

 定时器T =新的Timer();
    T.scheduleAtFixedRate(新的TimerTask(){
            @覆盖
            公共无效的run(){
                myTextView.setText(数=+计);
                算上++;
            }
        },1000,1000);
 

我知道有一些关于这个主题采用类似的问题,但好像他们不提有关停止计数。

任何建议,真的是AP preciated。

补充:

您好,我只是缩短了我的code只是这从一个更大的计划,但它仍然崩溃:

 包输入com.example.hello;
进口java.util.Timer中;
进口java.util.TimerTask中;
进口android.os.Bundle;
进口android.app.Activity;
进口android.view.Menu;
进口android.widget.TextView;
公共类MainActivity延伸活动{
    TextView的myTextView;
    诠释计数= 0;
    定时器T;
    @覆盖
    公共无效的onCreate(包savedInstanceState){
        super.onCreate(savedInstanceState);
        的setContentView(R.layout.activity_main);
        myTextView =(TextView中)findViewById(R.id.t);
        T =新的Timer();
        T.scheduleAtFixedRate(新的TimerTask(){
            @覆盖
            公共无效的run(){
                myTextView.setText(数=+计);
                算上++;
            }
        },1000,1000);
    }
    @覆盖
    公共布尔onCreateOptionsMenu(功能菜单){
        。getMenuInflater()膨胀(R.menu.activity_main,菜单);
        返回true;
    }

}
 
秒表计时器app下载 秒表计时器安卓版下载 v16.10.14 跑跑车安卓网

日志文件(我不想张贴这一点,因为实在是太长了,但有人要求它):

  07-28 17:35:07.012:W / dalvikvm(11331):主题ID = 7:线程退出与未捕获的异常(组= 0x4001d800)
07-28 17:35:07.016:E / AndroidRuntime(11331):致命异常:定时器0
07-28 17:35:07.016:E / AndroidRuntime(11331):android.view.ViewRoot $ CalledFromWrongThreadException:只有创建视图层次可以触摸其观点原来的线程。
07-28 17:35:07.016:E / AndroidRuntime(11331):在android.view.ViewRoot.checkThread(ViewRoot.java:2802)
07-28 17:35:07.016:E / AndroidRuntime(11331):在android.view.ViewRoot.requestLayout(ViewRoot.java:594)
07-28 17:35:07.016:E / AndroidRuntime(11331):在android.view.View.requestLayout(View.java:8125)
07-28 17:35:07.016:E / AndroidRuntime(11331):在android.view.View.requestLayout(View.java:8125)
07-28 17:35:07.016:E / AndroidRuntime(11331):在android.view.View.requestLayout(View.java:8125)
07-28 17:35:07.016:E / AndroidRuntime(11331):在android.view.View.requestLayout(View.java:8125)
07-28 17:35:07.016:E / AndroidRuntime(11331):在android.widget.RelativeLayout.requestLayout(RelativeLayout.java:254)
07-28 17:35:07.016:E / AndroidRuntime(11331):在android.view.View.requestLayout(View.java:8125)
07-28 17:35:07.016:E / AndroidRuntime(11331):在android.widget.TextView.checkForRelayout(TextView.java:5378)
07-28 17:35:07.016:E / AndroidRuntime(11331):在android.widget.TextView.setText(TextView.java:2688)
07-28 17:35:07.016:E / AndroidRuntime(11331):在android.widget.TextView.setText(TextView.java:2556)
07-28 17:35:07.016:E / AndroidRuntime(11331):在android.widget.TextView.setText(TextView.java:2531)
07-28 17:35:07.016:E / AndroidRuntime(11331):在com.example.hello.MainActivity $ 1.运行(MainActivity.java:21)
07-28 17:35:07.016:E / AndroidRuntime(11331):在java.util.Timer中的$ TimerImpl.run(Timer.java:289)
 

解决方案

您可以引入标志。像 isPaused得到。触发此标志时暂停按钮pressed。检查你的计时器任务的标志值。成功。

 定时器T =新的Timer();
T.scheduleAtFixedRate(新的TimerTask(){
        @覆盖
        公共无效的run(){
            runOnUiThread(新的Runnable()
            {
                @覆盖
                公共无效的run()
                {
                    myTextView.setText(数=+计);
                    算上++;
                }
            });
        }
    },1000,1000);


 的onClick(视图v)
 {
      //这是暂停按钮,点击监听器
      T.cancel();
 }
 

I have a simple program with one TextView and two Buttons: Button1 and Button2.

Clicking on Button 1 will start a counter, increasing by 1 every 1 second and show result on TextView; clinking on Button 2 will stop it. Here is a part of my code for Button1. But it does not work.

    Timer T=new Timer();
    T.scheduleAtFixedRate(new TimerTask() {         
            @Override
            public void run() {
                myTextView.setText("count="+count);
                count++;                
            }
        }, 1000, 1000);

I know that there are some similar questions about this using Thread but it seems like they do not mention about stopping the counter.

Any suggestion is really appreciated.

Added:

Hello, I just shortened my code just to this from a much bigger program, but it is still crashed:

package com.example.hello;
import java.util.Timer;
import java.util.TimerTask;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.TextView;
public class MainActivity extends Activity {
    TextView myTextView;
    int count=0;
    Timer T;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        myTextView=(TextView)findViewById(R.id.t);
        T=new Timer();
        T.scheduleAtFixedRate(new TimerTask() {         
            @Override
            public void run() {
                myTextView.setText("count="+count);
                count++;                
            }
        }, 1000, 1000);       
    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }

}

The log file (I do not want to post this because it is too long but someone requested it):

07-28 17:35:07.012: W/dalvikvm(11331): threadid=7: thread exiting with uncaught exception (group=0x4001d800)
07-28 17:35:07.016: E/AndroidRuntime(11331): FATAL EXCEPTION: Timer-0
07-28 17:35:07.016: E/AndroidRuntime(11331): android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
07-28 17:35:07.016: E/AndroidRuntime(11331):    at android.view.ViewRoot.checkThread(ViewRoot.java:2802)
07-28 17:35:07.016: E/AndroidRuntime(11331):    at android.view.ViewRoot.requestLayout(ViewRoot.java:594)
07-28 17:35:07.016: E/AndroidRuntime(11331):    at android.view.View.requestLayout(View.java:8125)
07-28 17:35:07.016: E/AndroidRuntime(11331):    at android.view.View.requestLayout(View.java:8125)
07-28 17:35:07.016: E/AndroidRuntime(11331):    at android.view.View.requestLayout(View.java:8125)
07-28 17:35:07.016: E/AndroidRuntime(11331):    at android.view.View.requestLayout(View.java:8125)
07-28 17:35:07.016: E/AndroidRuntime(11331):    at android.widget.RelativeLayout.requestLayout(RelativeLayout.java:254)
07-28 17:35:07.016: E/AndroidRuntime(11331):    at android.view.View.requestLayout(View.java:8125)
07-28 17:35:07.016: E/AndroidRuntime(11331):    at android.widget.TextView.checkForRelayout(TextView.java:5378)
07-28 17:35:07.016: E/AndroidRuntime(11331):    at android.widget.TextView.setText(TextView.java:2688)
07-28 17:35:07.016: E/AndroidRuntime(11331):    at android.widget.TextView.setText(TextView.java:2556)
07-28 17:35:07.016: E/AndroidRuntime(11331):    at android.widget.TextView.setText(TextView.java:2531)
07-28 17:35:07.016: E/AndroidRuntime(11331):    at com.example.hello.MainActivity$1.run(MainActivity.java:21)
07-28 17:35:07.016: E/AndroidRuntime(11331):    at java.util.Timer$TimerImpl.run(Timer.java:289)

解决方案

You can introduce flag. Something like isPaused. Trigger this flag whenever 'Pause' button pressed. Check flag value in your timer task. Success.

Timer T=new Timer();
T.scheduleAtFixedRate(new TimerTask() {         
        @Override
        public void run() {
            runOnUiThread(new Runnable()
            {
                @Override
                public void run()
                {
                    myTextView.setText("count="+count);
                    count++;                
                }
            });
        }
    }, 1000, 1000);


 onClick(View v)
 {
      //this is 'Pause' button click listener
      T.cancel();
 }