计数器不会在新的AsyncTask实例中重启

时间:2016-09-12 03:40:19

标签: java android android-asynctask

所以,我只有一个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>

有什么方法可以解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

我相信AsyncTask有一个无限循环而且没有被取消。

您可以将true替换为!isCanceled()。一旦取消,AsyncTask就应该结束了。

您可能还想在停止时将任务设置为null