2

我是 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 方法被调用而停止。但是如果用户再次按下相同的按钮应用程序强制关闭和你不能的异常启动已经启动的任务。那么执行这种操作的方法是什么。感谢您的回复。

4

3 回答 3

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

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

于 2013-04-19T06:13:57.307 回答
2

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

检查这个答案。

于 2013-04-19T06:09:45.367 回答
0

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

线程规则

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

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

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

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

请在开发者网站中了解更多信息

于 2013-04-19T06:24:12.373 回答