Привет всем,Android Thread Allocation - растущая куча?
Я разрабатываю приложение для Android против API 7 в тот момент, когда я использую действие, которое необходимо перезапустить. Допустим, моя деятельность выглядит следующим образом:
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);
}
};
}
Проблема заключается в том, что дс не кажется, чтобы освободить нить fullAnim так что куча растет ~ 100К при каждом запуске - пока она замедляется и падает. Объявление fullAnim как static решает эту проблему, но поскольку я использую нестатические ссылки, это не работает для меня.
Итак, на данный момент я добрался до утра - и я надеюсь, что вы можете посоветовать мне, куда идти дальше. Есть ли что-то, что я могу сделать неправильно или есть инструмент, который я могу использовать для управления потоками, чтобы удалить и освободить кучу после перезагрузки.
любезно касается
UPDATE
спасибо всем, кто ответил - помог много. используя таймер в конце концов. я сделал следующие изменения:
/****** 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 долго это было довольно приличным решением, не сталкиваясь большими последствиями. KUDOS!
я не использую таймер ГРАФИК задачи - не знаю, если его плохая практика, но анимация называется так:
Thread t = new Thread(fullAnim);
t.start();
Я пробовал это с помощью написанного примера активности - куча все еще растет:/ – user1386375
Еще одна альтернатива, которую вы можете использовать, - Timer и TimerTask. вы можете отменить таймер при уничтожении. –
thx alot! TimerTask сделал мой день! <3 – user1386375