【问题标题】:how to start the same asynctask on again clicking on the button [duplicate]如何再次单击按钮启动相同的异步任务[重复]
【发布时间】:2013-04-19 06:07:57
【问题描述】:

我是 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 方法中为该类创建对象,所以现在问题来了。

当用户第一次按下计数器开始并在文本视图中显示并再次按下相同的按钮时,计数器进度由于 oncancel 方法被调用而停止。但是如果用户再次按下相同的按钮应用程序强制关闭和异常,你无法启动已经启动的任务。请问如何执行这种操作。感谢您的回复。

【问题讨论】:

    标签: android


    【解决方案1】:
    if(check==true){
        rec_forward_task = new CounterForwardTask();
        rec_forward_task.execute();
    }
    else
    {
        rec_forward_task.cancel();
    }
    

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

    【讨论】:

    • 该任务只能执行一次(如果尝试第二次执行,则会抛出异常。)这就是开发者网站所说的。
    • Jashan,您可以创建一个新实例并再次执行它。您不能执行已执行的实例。但是您始终可以创建新实例并执行它。请在投票前尝试一下。
    • 谢谢...它有效,也为你投票
    • 已经接受并实施了。
    • @PassionateAndroiden 异步任务实例化技巧对我很有帮助,谢谢。 :)
    【解决方案2】:

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

    查看this answer.

    【讨论】:

      【解决方案3】:

      异步任务设计为只运行一次。但是您可以通过创建 asynctask 类的新实例来运行它。看Passionate Androiden的答案

      线程规则

      要使此类正常工作,必须遵循一些线程规则:

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

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

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

      请在Developer site了解更多信息

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-01-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-09
        • 1970-01-01
        • 2019-12-20
        • 1970-01-01
        相关资源
        最近更新 更多