0

Android アプリケーションを作成するプログラムがあります。

このプログラムのメイン クラスは、非同期タスクを使用して接続し、データを要求します。接続と要求データはどちらもボタンで開始され、どちらの場合もプログレス バーが表示されます。

connectの非同期タスクを開始すると、プログラムはメソッドonPreExecute()doInBackground()onProgressUpdate()、およびonPostExecute()を実行しますが、これは予想どおりです。

ただし、onPostExecute()の後、デバッガー ウィンドウを見ると、AsyncTaskはまだ実行されており、引き続き実行されます。次にデータを要求すると、新しいAsyncTaskが作成され、2 つ実行されます。

しばらくプログラムを使用した後、約 20の AsyncTaskスレッドがまだ実行されている状態になるため、最初のAsyncTask (実際には 2 番目の AsyncTask が終了したら)を終了するにはどうすればよいですか?

以下にコードを含めました。

private ProgressDialog connectionDialog;
private ProgressDialog requestDataDialog;

private ProgressDialog usingDialog;

private int currentDialog;

public void connectClick(View view) //When the connect button is clicked
{
    currentDialog = 1;

    new PerformTask().execute();
}

private class PerformTask extends AsyncTask<Void, Integer, Integer> 
{
    protected void onPreExecute()
    {
        showDialog(currentDialog);
    }

    protected Integer doInBackground(Void... voi) 
    {
        int total = 0;

        //Perform the task required

        publishProgress(total);

        return total;
    }

    protected void onProgressUpdate(Integer... progress) 
    {
        usingDialog.setProgress(progress[0]);
    }

    protected void onPostExecute(Integer result) 
    {
        removeDialog(currentDialog);
    }
}

protected Dialog onCreateDialog(int id) 
{   
    //Setup the dialogs
}

public void requestDownloadClick(View view)
{
    currentDialog = 2;

    new PerformTask().execute();
}
4

1 に答える 1

0

完全を期すために、質問を受け入れることができます。ここに、stackoverflow.com/a/3077508/1514187 にある grv_9098 による回答があります。

AsyncTask は、ThreadPoolExecutor で作成されたスレッド プールを管理します。5 ~ 128 のスレッドがあります。5 つ以上のスレッドがある場合、それらの余分なスレッドは削除されるまで最大 10 秒間残ります。(注: これらの数値は現在表示されているオープン ソース コードのものであり、Android のリリースによって異なります)。

AsyncTask スレッドはそのままにしておいてください。

于 2012-08-14T09:28:24.317 に答える