Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Timer.schedule运行一次,即使使用句点_Java_Android_Timertask - Fatal编程技术网

Java Timer.schedule运行一次,即使使用句点

Java Timer.schedule运行一次,即使使用句点,java,android,timertask,Java,Android,Timertask,我是一名学生,正在尝试为我的一个模块的小型项目创建一个应用程序,我正在尝试创建一个每隔几秒钟从服务器抓取数据的应用程序,以便更新它。我尝试使用java定时器和timerTask重复运行代码,但程序只运行一次,并且在实现定时器后,“获取”按钮不能按预期工作(假设立即获取数据) public类MainActivity扩展了AppCompatActivity实现了OnClickListener{ 私人按钮速度; 私有文本视图结果; 定时器; TimerTask TimerTask; 私有文本视图速度;

我是一名学生,正在尝试为我的一个模块的小型项目创建一个应用程序,我正在尝试创建一个每隔几秒钟从服务器抓取数据的应用程序,以便更新它。我尝试使用java定时器和timerTask重复运行代码,但程序只运行一次,并且在实现定时器后,“获取”按钮不能按预期工作(假设立即获取数据)

public类MainActivity扩展了AppCompatActivity实现了OnClickListener{
私人按钮速度;
私有文本视图结果;
定时器;
TimerTask TimerTask;
私有文本视图速度;
最终StringBuilder=新StringBuilder();
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
结果=(TextView)findViewById(R.id.result);
sSpeed=(TextView)findViewById(R.id.sSpeed);
速度=(按钮)findviewbyd(R.id.get_按钮);
speed.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
获取网站();
}
});
View aboutButton=this.findViewById(R.id.about_按钮);
aboutButton.setOnClickListener(此);
查看退出按钮=this.findViewById(R.id.exit_按钮);
setOnClickListener(这个);
}
公共void onClick(视图v){
开关(v.getId()){
案例R.id.get_按钮:
获取网站();
打破
案例R.id.about_按钮:
意图i=新意图(此,About.class);
星触觉(i);
打破
案例R.id.exit_按钮:
完成();
打破
}
}
私人网站(){
新线程(newrunnable()){
@凌驾
公开募捐{
试一试{
Document doc=Jsoup.connect(“http://10.0.2.2:8080/Start_Stop_buttons_UTF8.html).get();
//Elements=doc.getElementsByTag(“p”);
元素=单据选择(“p”);
//字符串title=doc.title();
builder.append(title.append(“\n”);
用于(元素标记:元素){
builder.append(“\n\n”).append(tag.text());
}
}捕获(IOE异常){
//e、 printStackTrace();
builder.append(“错误:”).append(e.getMessage()).append(“\n”);
}
runOnUiThread(新的Runnable(){
@凌驾
公开募捐{
字符串a=builder.toString();//将数据从html解析为新字符串
a=a.substring(a.indexOf(“:”)+1,a.indexOf(“Control”)).trim();//trim字符串内容
字符串b=builder.toString();
b=b.substring(11,b.indexOf(“:”)+1).trim();
double speed=double.parseDouble(a);//将字符串转换为double
if(speed 1500))Log.i(“HTML文本”,“太快了!”);
结果:setText(a);
设定速度(b);
}
});
}
}).start();
}
受保护的void onResume(){
super.onResume();
startTimer();
}
公共无效startTimer(){
定时器=新定时器();
timerTask=新的timerTask(){
@凌驾
公开募捐{
获取网站();
}
};
时间表(timerTask,15003000);
}
公共无效停止计时器(){
如果(计时器!=null){
timer.cancel();
timer.purge();
}
}
}


我是否正确地实现了计时器以重复运行getwebsite(),并能够在单击get按钮时获得即时更新?或者有更好的方法使用不同的方法实现这些功能吗?

您从未在
ClickListener中调用
startTimer
方法。您只需打一个电话到
getWebsite
。将呼叫更改为
startTimer

 speed.setOnClickListener(new View.OnClickListener(){
       @Override
        public void onClick(View view) {
           startTimer();
       }
    });
在启动新的计时器之前,您可能还需要检查计时器是否已在运行。为此,在
stopTimer
方法上指定一个
null
值,例如

public void stopTimer(){
    if(timer != null){
        timer.cancel();
        timer.purge();
        timer = null;
    }
}
而您的
起始用户将如下所示

public void startTimer(){
    if(timer != null) return; // don't start multiple timers
    timer = new Timer();
    timerTask = new TimerTask() {
        @Override
        public void run() {
            getWebsite();

        }
    };
    timer.schedule(timerTask,1500,3000);
}

您从未在
ClickListener
中调用
startTimer
方法。您只需打一个电话到
getWebsite
。将呼叫更改为
startTimer

 speed.setOnClickListener(new View.OnClickListener(){
       @Override
        public void onClick(View view) {
           startTimer();
       }
    });
在启动新的计时器之前,您可能还需要检查计时器是否已在运行。为此,在
stopTimer
方法上指定一个
null
值,例如

public void stopTimer(){
    if(timer != null){
        timer.cancel();
        timer.purge();
        timer = null;
    }
}
而您的
起始用户将如下所示

public void startTimer(){
    if(timer != null) return; // don't start multiple timers
    timer = new Timer();
    timerTask = new TimerTask() {
        @Override
        public void run() {
            getWebsite();

        }
    };
    timer.schedule(timerTask,1500,3000);
}

谢谢你的回复。你的答案可能会很有用,但我仍然会遇到同样的错误:它仍然没有根据显示数据的变化进行更新。我尝试更改要在web上显示的预期数据,但它没有显示在模拟器中。问题出在定时器还是我的代码上?还有,“获取按钮”没有响应我的代码的原因是什么?谢谢你的回复。你的答案可能会很有用,但我仍然会遇到同样的错误:它仍然没有根据显示数据的变化进行更新。我尝试更改要在web上显示的预期数据,但它没有显示在模拟器中。问题出在定时器还是我的代码上?还有,“获取按钮”不响应我的代码的原因是什么?