android 终止线程几种方法

android 终止线程几种方法

android 终止线程几种方法

2021-07-26 21:58:25

一、终止线程的几种方法

在android 中终止线程的操作很少遇到,之前还有 stop() 等方法可以用,但现在都不推荐使用了。在日常开发中我们肯定会有要终止线程的时候,如:当一个组件或者activity被destory() 的时候,要求其启动的线程也一起终止掉,有几种方法可以实现,如下:

1.初始化的时候,定义启动的线程为一个守护线程,这样当主线程消亡掉的时候,其他线程也会被终止。

// 使用下面的方法,当初始化一个线程时

// 该语句是设置为守护线程,这样在主线程结束的时候,相应起的守护线程才能正常结束。就是因为这样的原因,我们不能在这样的线程中做一些操作,比如程序对文件的读写等。当用户线程结束的时候,守护线程也同时结束,这样就没有进行文件读写操作。

myThread.setDaemon(true);

myThread.start;

2、可在activity中的onstop()方法中调用以下代码。

if (myThread != null) {

Thread dummy = myThread;

myThread = null;

dummy.interrupt();

}

3、可在线程run()方法中设置标志位。

if (!paused) {

// do something,这是线程run方法中

}

boolean paused = false;

// 可在onPause()中通过设置标志位使线程不活动,

protected void onPause() {

paused = true;

super.onPause();

}

// 可在onPause()中通过设置标志位激活线程,

@Override

protected void onResume() {

super.onResume();

paused = false;

}

二、实例

在处理多线程任务时,比如倒计时接单(通过子线程实现倒计时),新来订单15s后自动消失。而业务需求中又要允许用户在倒计时未结束时手动划掉消失,则此时需要停止倒计时线程。或者可能有时有多单依次叠加,此时最上面的一单消失时,也需要先停止上一单倒计时再自动开启下一单的倒计时。

AsyncTask自带线程停止方法 taskProgress.cancel(true)(taskProgress是TaskProgress继承AsyncTask后新new的对象),并且自带判断线程是否正在执行的方法taskProgress.getStatus() == AsyncTask.Status.RUNNING。

代码如下:

/*

* 新来订单时开始计时

*/

public static TaskProgress taskProgress;

public void startCountdown(final int mProgress, final int maxtime) {

if (maxtime > 0) {

roundProgressBar.setVisibility(View.VISIBLE);

if (taskProgress != null && taskProgress.getStatus() == AsyncTask.Status.RUNNING)

{

taskProgress.cancel(true); // 如果Task还在运行,则先取消它,然后执行关闭activity代码

taskProgress = null;

}

taskProgress = new TaskProgress(maxtime);

taskProgress.execute(0);

}

}

/*

* 开启倒计时,倒计时任务需要能手动停止,故而用AsyncTask,Thread无法在左右滑动卡片时停止线程

*/

public class TaskProgress extends AsyncTask {// 继承AsyncTask

int maxtime;

int mProgress;

public TaskProgress(int maxtime) {

this.maxtime = maxtime;

}

@Override

protected Integer doInBackground(Integer... params) {

// 处理后台执行的任务,在后台线程执行

int flag = 1;

if (isCancelled())

return null;

mProgress = params[0];

while (mProgress <= maxtime && !isCancelled()) {

try {

publishProgress(mProgress);//将会调用onProgressUpdate(Integer... progress)方法

mProgress += 1;

Thread.sleep(1000);

} catch (InterruptedException e) {

e.printStackTrace();

}

LogUtils.e("-----------------------", String.valueOf(mProgress));

LogUtils.e("-----------------------", String.valueOf(mProgress));

LogUtils.e("-----------------------", String.valueOf(mProgress));

}

return flag;

}

protected void onProgressUpdate(Integer... progress) {

// 在调用publishProgress之后被调用,在ui线程执行

// roundProgressBar.setProgress(progress[0]);

//更新进度条的进度

if (isCancelled()) {

return;

} else {

roundProgressBar.setProgress(progress[0], maxtime);

}

}

protected void onPostExecute(Integer result) {

// 后台任务执行完之后被调用,在ui线程执行

if (result != null) {

//自动消失

MainActivity.getInstance().vanishOnDisappear();

}

}

protected void onPreExecute() {

// 在doInBackground(Params...)之前被调用,在ui线程执行

roundProgressBar.setProgress(0, maxtime);// 进度条复位

}

protected void onCancelled() {

// 在ui线程执行

// roundProgressBar.setProgress(0, maxtime);// 进度条复位

}

}

相关推荐

九九重阳节什么意思
bst365app

九九重阳节什么意思

📅 06-30 👁️ 6220
csgo怎麼改名
Bet体育365提款流程

csgo怎麼改名

📅 07-13 👁️ 8069