Во всяком случае, чтобы убить поток /asynctask, которые запускаются из закрытого приложения в Android

Есть ли в любом случае, чтобы убить поток /asynstask из закрытого приложения Android

Мое приложение должно убить 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), который работает вечно, даже когда я закрываю приложение. Проблема заключается в том, что если я снова открою это приложение, я хочу, чтобы старая асинхронная задача была уничтожена, а новая асинктическая задача начиналась с 1. Теперь существует много асинктических задач, если я запускаю это приложение более 1 раза.

Спасибо

2 ответа

Это плохой выбор, если вы хотите рассчитывать на фон, используя AsyncTask внутри Activity, потому что это приведет к утечке Activity. Я заставляю вас использовать AlarmManager или Service вместо этого. Просто для знаний я покажу вам, как убить вашу AsyncTask внутри Activity, когда она остановилась или в фоновом режиме. Во-первых, вы должны сделать переменную-член вашей AsyncTask

private LongOperation task;

Затем вы начинаете свой AsyncTask, как это

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

Наконец, вы останавливаете свой AsyncTask из onStop активности

@Override
protected void onStop() {
    super.onStop();
    task.cancel(true);
}

Я думаю, что вы взяли на себя старый 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();
        }
    }
}
Другие вопросы по тегам