В основном TextView
или любые другие View
s содержат ссылку на объект Context
, представляющий соответствующий Activity
.Когда вы сохраняете строгое указание любого View
в Thread
, вы сохраняете не только объект View
, но и объект Context
, представляющий Activity
, который его создал.Теперь, когда Thread
s не связаны с жизненным циклом Activity, они будут продолжать работать даже после уничтожения Activity
.В этом случае Thread
будет содержать уничтоженную ссылку Activity
через этот объект View
, что приведет к утечке памяти.
Вышеупомянутая проблема может быть решена путем хранения слабой ссылки:объект View
, так что GC может собирать его при необходимости.Вы можете избавиться от утечки памяти следующим образом:
public class HandlerActivity extends AppCompatActivity implements Runnable {
WeakReference<ProgressBar> pb;
WeakReference<TextView> txtRate;
Button btnStart;
static int value;
@Override
protected void onCreate(Bundle savedInstanceState) {
...
pb = new WeakReference<>(findViewById(R.id.pb)); // you may require to cast findViewById() to ProgressBar
txtRate = new WeakReference<>(findViewById(R.id.txtRate)); // you may require to cast findViewById() to TextView
...
}
Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if(pb.get()!=null) pb.get().setProgress(value);
if(txtRate.get()!=null) txtRate.get().setText("Process : " + value + "%");
}
};
@Override
public void run() {
for (int i = 1; i <= 100; i++) {
// Its always recommended to check if activity is running and stop the thread if not running
if(isFinishing() || isDestroyed()) {
return;
}
}
}
}