大家好,
我正在开发一个针对 API 7 的 android 应用程序,此时我使用需要重新启动的活动。假设我的活动如下所示:
public class AllocActivity extends Activity implements OnClickListener{
Button but;
private Handler hand = new Handler();
@Override
protected void onCreate(Bundle savedInstanceState) {
setContentView(R.layout.activity_alloc);
but = (Button) findViewById(R.id.button);
but.setText("RELOAD");
but.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0){
Intent intent = getIntent();
startActivity(intent);
finish();
}
});
}
@Override
protected void onDestroy(){
super.onDestroy();
System.gc();
}
/****** THREADS AND RUNNABLES ******/
final Runnable fullAnim = new Thread(new Runnable(){
@Override
public void run(){
try{
hand.post(anim1);
Thread.sleep(2000);
hand.post(anim2);
Thread.sleep(1000);
// and so on
}catch(InterruptedException ie){ie.printStackTrace();}
}
});
final Runnable anim1 = new Runnable() {
@Override
public void run(){
// non-static method findViewById
ImageView sky = (ImageView)findViewById(R.id.sky);
}
};
}
问题是 gc 似乎没有释放 fullAnim 线程,因此每次重新启动时堆都会增长约 100K - 直到它变慢并崩溃。将 fullAnim 声明为静态确实解决了这个问题 - 但是当我使用非静态引用时,这对我来说不起作用。
所以在这一点上,我有点迷失了——我希望你能告诉我下一步该去哪里。是否有什么我可能做错了,或者是否有一个工具可以用来管理线程以在重新启动后丢弃和释放堆。
亲切的问候
更新
感谢所有回答的人 - 帮助很大。使用 TimerTask 最终成功了。我做了以下更改:
/****** THREADS AND RUNNABLES ******/
final TimerTask fullAnim = new TimerTask(){
@Override
public void run(){
try{
hand.post(anim1);
Thread.sleep(2000);
hand.post(anim2);
Thread.sleep(1000);
// and so on
}catch(InterruptedException ie){ie.printStackTrace();}
}
};
由于活动长度超过 6k loc,这是一个相当不错的解决方案,不会面临更大的影响。赞!
我不使用计时器来安排任务 - 不知道它是否是不好的做法,但动画是这样调用的:
Thread t = new Thread(fullAnim);
t.start();