线程的控制一直是一个头疼的问题,控制不好的话,内存占用特别的厉害,那么有什么方法能让没有用的线程释放掉呢?
也许在有点需求中会同时开启几个线程来干某些事,但是在这些事情忙完后,Android自己不会立即将使用完的垃圾迅速回收掉,也就是说,咱们new一个线程,就会多出一份垃圾,一个两个的无关紧要,太多了或者设备性能不好时,问题还是会出现的。Thread的控制,还是咱们自己控制的好。
下面是现在我用这的方案,以一个内部类的方式实现Thread(例子中的MyThread)
public class MainActivity extends Activity {
/**
* 唯一的全局线程变量
*/
private volatile MyThread myThread;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (null != myThread) {
myThread.stopMyThread();
}
myThread = new MyThread(10); // 十秒以后启动线程
myThread.start();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
/**
* 以内部类的方式继承Thread
*/
class MyThread extends Thread {
private int daily = 0;
public MyThread(int daily) {
this.daily = daily;
}
public void stopMyThread() {
MyThread tmpThread = myThread;
myThread = null;
if (tmpThread != null) {
tmpThread.interrupt();
}
}
public void run() {
if (myThread == null) {
return; // stopped before started.
}
try {
for (int i = 0; i < daily; i++) {
sleep(1000);
}
Thread.yield(); // let another thread have some time perhaps to stop this one.
if (Thread.currentThread().isInterrupted()) {
throw new InterruptedException("Stopped by ifInterruptedStop()");
}
// do something
System.out.println("--------1----------");
System.out.println("--------2----------");
} catch (Throwable t) {
System.out.println("--------Throwable--------" + t);
System.out.println("--------over----------");
// log/handle all errors here
}
}
}
}
接着在所在类中定义一个全局变量,
private volatile MyThread myThread;
每次在使用
MyThread
线程时,先进行一次判断再去创建线程
if (null != myThread) {
myThread.stopMyThread();
}
myThread = new MyThread(10); //十秒以后启动线程
myThread.start();
}
myThread = new MyThread(10); //十秒以后启动线程
myThread.start();
这样的话,自己去控制何时去释放内存,通过自己掊异常的形式去释放内存,释放的干干净净。