0

无论如何要从关闭的android应用程序中杀死线程/ asyncstask

我的应用程序必须在运行新的 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 次,就会有很多异步任务。

谢谢

4

2 回答 2

1

如果您想在 Activity 中使用 AsyncTask 依靠后台,这是一个糟糕的选择,因为它会导致 Activity 泄漏。我强制您改用 AlarmManager 或 Service。只是为了知识,我将向您展示当 Activity 停止或在后台时如何在 Activity 中杀死您的 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 回答