如何再次单击按钮启动相同的asynctask

时间:2013-04-19 06:07:58

标签: android

我是Android新手,现在正在使用AsyncTask处理计数器事务。

所以问题是我有一个按钮并且有一个按钮OnClickListener

button.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                boolean check;
                check=check_button_status();
                if(check==true){
                rec_forward_task.execute();
                }
                else
                {
                    rec_forward_task.cancel();
                }

            }
        });

所以这里rec_forward_task是扩展AsyncTask的类。 AsyncTask课程就在这里。 //

private class CounterForwardTask extends AsyncTask<Void, Integer, Integer>
{
    TextView record_counter_display;
    int rec_counter,count;
    int last_value;

    @Override
    protected void onPreExecute() {
        // TODO Auto-generated method stub
        record_counter_display=(TextView) findViewById(R.id.rec_voice_counter);
        rec_counter=0;
        record_counter_display.setText(String.valueOf(rec_counter));

        count=0;
    }

    public void cancel() {
        // TODO Auto-generated method stub
        onCancelled();
    }

    @Override
    protected Integer doInBackground(Void... params) {
        // TODO Auto-generated method stub
        while(rec_status)
        {
            publishProgress(count);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            last_value=count;
            count=count+1;
        }
        return 1;
    }

    @Override
    protected void onCancelled() {
        // TODO Auto-generated method stub
        record_counter_display.setText(String.valueOf(0));
    }

    @Override
    protected void onProgressUpdate(Integer... values) {
        // TODO Auto-generated method stub
        runOnUiThread(new Runnable() {

            @Override
            public void run() {
                // TODO Auto-generated method stub
                record_counter_display.setText(String.valueOf(count));
            }
        });
    }

    @Override
    protected void onPostExecute(Integer result) {
        // TODO Auto-generated method stub
        record_counter_display.setText(String.valueOf(last_value));
    }

}

我只是在oncreate方法中为该类创建对象,所以现在的问题是。

当用户第一次按下计数器正在启动并在textview中显示并再次按下同一个按钮时,由于oncancel方法被调用,计数器进度停止。但是如果用户再次按下同一个按钮app强制关闭和异常你无法启动已经启动的任务。那么执行此类操作的方式是什么。感谢您的回复。

3 个答案:

答案 0 :(得分:4)

if(check==true){
    rec_forward_task = new CounterForwardTask();
    rec_forward_task.execute();
}
else
{
    rec_forward_task.cancel();
}

而不是在onCreate中实例化AsyncTask,而不是在需要启动它时实例化它。希望这可以帮助。

答案 1 :(得分:2)

您必须创建一个新的AsyncTask对象。 AsyncTasks只能运行一次。

检查this answer.

答案 2 :(得分:0)

异步任务只能运行一次。但是您可以通过创建asynctask类的新实例来运行它。请参阅Passionate Androiden的答案

线程规则

此类必须遵循一些线程规则才能正常工作:

必须在UI线程上加载AsyncTask类。这是从JELLY_BEAN开始自动完成的。

必须在UI线程上创建任务实例。 必须在UI线程上调用execute(Params ...)。 不要手动调用onPreExecute(),onPostExecute(Result),doInBackground(Params ...),onProgressUpdate(Progress ...)。

该任务只能执行一次(如果尝试第二次执行,则会抛出异常。)

请在Developer site

中查找更多内容