Во всяком случае, чтобы убить поток /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();
}
}
}