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

Есть ли способ убить поток/асинстаск из закрытого приложения для Android?

Мое приложение должно убить асинтаск перед запуском нового асинтаска

Я пробовал 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 раза.

Спасибо


person Thanawat.h    schedule 14.03.2017    source источник
comment
если ваше приложение будет убито, тогда у них нет ссылки на асинтаск или поток. Он будет собран мусором, поэтому вам не придется закрывать или удалять его снова.   -  person Jitesh Mohite    schedule 14.03.2017
comment
Вместо этого используйте AlarmManager, не используйте AsyncTask   -  person HendraWD    schedule 14.03.2017
comment
добавьте некоторый флаг в свой поток, который будет проверяться, чтобы решить, должен ли он продолжать работу, и установите для него значение true, когда приложение будет закрыто.   -  person Vladyslav Matviienko    schedule 14.03.2017
comment
new LongOperation(this) это this это Activity? Зачем вам нужно передавать Activity в AsyncTask, если у вас нет этого конструктора на LongOperation?   -  person HendraWD    schedule 14.03.2017


Ответы (2)


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

private LongOperation task;

Затем вы запускаете свой AsyncTask следующим образом.

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

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

@Override
protected void onStop() {
    super.onStop();
    task.cancel(true);
}
person HendraWD    schedule 14.03.2017
comment
Я имею в виду, что фоновая служба (Asynctask) все еще работает вечно, даже если я закрываю приложение. Проблема в том, что если я снова открою это приложение, я хочу, чтобы старая асинтаска была убита, а новая асинтаска начиналась с 1. теперь есть много асинтасков, если я запускаю это приложение более 1 раза. - person Thanawat.h; 14.03.2017
comment
@ Thanawat.h Нет. Когда вы закрываете приложение, AsyncTask закрывается. - person JonZarate; 14.03.2017
comment
Да, AsyncTask будет завершено, если приложение закрыто, но не если приложение работает в фоновом режиме. Service не является AsyncTask, вы можете увидеть это здесь developer.android.com/guide/components /services.html - person HendraWD; 14.03.2017

Я думаю, вы предположили, что старый 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();
        }
    }
}
person JonZarate    schedule 14.03.2017
comment
О, я скучаю по этому, спасибо, и да, я имею в виду старую тему из этого приложения. - person Thanawat.h; 14.03.2017
comment
да, я уже выполняю, но в этом посте я не скопировал весь свой код, я пропустил эту строку. хаха @JonZarate - person Thanawat.h; 14.03.2017
comment
Его все равно нельзя убить. теперь я пользуюсь сервисом, и это работает. - person Thanawat.h; 16.03.2017
comment
@ Thanawat.h Тогда вы должны опубликовать свой ответ и принять его для других пользователей, которые приходят и читают его. - person JonZarate; 22.03.2017