所以,我只有一个Android应用程序,按下“开始”按钮后,每秒会增加一次计数器。这是在AsyncTask中完成的,它通过调用Thread.sleep(1000);
每秒递增一次。当按下停止按钮时,任务被取消,但是当再次按下开始按钮时,按钮上的文本变为“停止”,但计数器似乎没有启动(TextView不会更新和{{1计数器没有显示)。
按下停止按钮后,任务将被取消,并为变量分配一个新实例:
System.out.println
布局:
package com.lukechenshui.timelapse;
import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
CounterTask task = new CounterTask();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void toggleTimer(View view){
Button button = (Button)findViewById(R.id.timerButton);
if(task.getStatus() == AsyncTask.Status.RUNNING){
task.cancel(false);
task = new CounterTask();
button.setText("Start");
}
else{
Integer temp = 0;
task.execute(temp);
button.setText("Stop");
}
System.out.println(task.getStatus());
}
private class CounterTask extends AsyncTask {
@Override
protected Object doInBackground(Object[] params) {
for(int counter = 0; true; counter++){
try{
publishProgress(counter);
Thread.sleep(1000);
}
catch(InterruptedException exc){
exc.printStackTrace();
}
}
}
@Override
protected void onProgressUpdate(Object[] values) {
TextView counterView = (TextView)findViewById(R.id.counterTextView);
counterView.setText(String.valueOf(values[0]));
System.out.println(values[0]);
}
}
}
示例输出:
<?xml version="1.0" encoding="utf-8"?>
<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:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.lukechenshui.timelapse.MainActivity"
android:orientation="vertical">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Start"
android:id="@+id/timerButton"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:clickable="true"
android:onClick="toggleTimer"
android:layout_gravity="center_horizontal" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/counterTextView"
android:layout_gravity="center_horizontal" />
</LinearLayout>
有什么方法可以解决这个问题吗?
答案 0 :(得分:1)
我相信AsyncTask有一个无限循环而且没有被取消。
您可以将true
替换为!isCanceled()
。一旦取消,AsyncTask就应该结束了。
您可能还想在停止时将任务设置为null