2

私は Android が初めてで、AsyncTask.

つまり、ボタンが1つあり、そのボタンが付いています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は を拡張するクラスですAsyncTaskAsyncTaskクラスはここにあります。///

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 オブジェクトを作成する必要があります。AsyncTasks は、一度だけ実行することを意図しています。

この回答を確認してください。

于 2013-04-19T06:09:45.367 に答える
0

非同期タスクは、1 回だけ実行するように設計されています。ただし、asynctask クラスの新しいインスタンスを作成することで実行できます。情熱的な Androiden の回答を見る

スレッドのルール

このクラスが正しく機能するためには、いくつかのスレッド化ルールに従う必要があります。

AsyncTask クラスを UI スレッドにロードする必要があります。これは、JELLY_BEAN の時点で自動的に行われます。

タスク インスタンスは、UI スレッドで作成する必要があります。execute(Params...) は UI スレッドで呼び出す必要があります。onPreExecute()、onPostExecute(Result)、doInBackground(Params...)、onProgressUpdate(Progress...) を手動で呼び出さないでください。

タスクは 1 回だけ実行できます (2 回目の実行を試みると、例外がスローされます)。

開発者サイトで詳細を確認してください

于 2013-04-19T06:24:12.373 に答える