0

閉じたAndroidアプリからスレッド/ aynstaskを強制終了する方法はありますか

私のアプリは、新しい asynctask を実行する前に asynctask を強制終了する必要があります

Thread.getAllStackTraces() を試し、アプリを開いたときに AsyncTask 名を確認しましたが、強制終了できません。

public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        killThreadByName("AsyncTask");
        LongOperation task = new LongOperation(this);
        task.execute();

    }

    public void killThreadByName(String threadName) throws InterruptedException {
        for (Thread t : Thread.getAllStackTraces().keySet()) {
            if (t.getName().contains(threadName)) {
                t.interrupt();

            }
        }
    }
    private class LongOperation extends AsyncTask<Void, String, Void> {
        @Override
        protected Void doInBackground(Void... params) {
            while(true){
                try {
                    Thread.sleep(1000);
                    publishProgress("This is number : " + i);
                    Log.i("TEST","NUMBER : " + i);

                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

            }
            return null;
        }
        @Override
        protected void onProgressUpdate(String... values) {
            super.onProgressUpdate(values);
            Toast.makeText(mContext, values[0], Toast.LENGTH_SHORT).show();
        }
        @Override
        protected void onPostExecute(Void aVoid) {
            super.onPostExecute(aVoid);
            Toast.makeText(mContext, "Done!", Toast.LENGTH_SHORT).show();

        }
    }
}

このアプリは 1 から 25 までカウントするためのもので、アプリを閉じてもまだ実行中です。

しかし、アプリを再度開くと、古いスレッドを強制終了できません。

つまり、アプリを閉じても、バックグラウンド サービス (Asynctask) は永久に実行され続けます。問題は、このアプリを再度開くと、古い asynctask を強制終了し、新しい asynctask を 1 から開始することです。このアプリを複数回起動すると、多くの asynctask が発生します。

ありがとうございました

4

2 に答える 2

1

アクティビティ内で AsyncTask を使用してバックグラウンドを利用したい場合は、アクティビティ リークが発生するため、不適切な選択です。代わりに AlarmManager または Service を使用するように強制します。知識のために、アクティビティが停止したとき、またはバックグラウンドでアクティビティ内で AsyncTask を強制終了する方法を示します。まず、AsyncTask のメンバー変数を作成する必要があります

private LongOperation task;

次に、このように AsyncTask を開始します

task = new LongOperation();
task.execute();

最後に、Activity の onStop から AsyncTask を停止します。

@Override
protected void onStop() {
    super.onStop();
    task.cancel(true);
}
于 2017-03-14T08:16:16.460 に答える
-1

Threadコードが実行されていないため、古いものは生きていると思い込んでいたと思います。

しかし、私はあなたが間違っていると思います。問題は、execute()電話に出られないことです。

次のコードを試してください。

public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        LongOperation task = new LongOperation(this);
        task.execute(); // <-- New added code
    }

    private class LongOperation extends AsyncTask<Void, String, Void> {
        @Override
        protected Void doInBackground(Void... params) {
            for (int i = 0; i < 25; i++) {
                try {
                    Thread.sleep(1000);
                    publishProgress("This is number : " + i);
                    Log.i("TEST","NUMBER : " + i);

                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            return null;
        }
        @Override
        protected void onProgressUpdate(String... values) {
            super.onProgressUpdate(values);
            Toast.makeText(mContext, values[0], Toast.LENGTH_SHORT).show();
        }
        @Override
        protected void onPostExecute(Void aVoid) {
            super.onPostExecute(aVoid);
            Toast.makeText(mContext, "Done!", Toast.LENGTH_SHORT).show();
        }
    }
}
于 2017-03-14T08:15:50.957 に答える