티스토리 뷰
프로그래밍/Android
[Android] This AsyncTask should be static or leaks might occur
DwEnn 2018. 2. 7. 16:10728x90
반응형
This AsyncTask should be static or leaks might occur
내부 Handler 와 동일한 문제이다.
non-static 내부 클래스는
클래스에 대한 참조를 그것을 포함하는 Activity 클래스 보다
오래 가지고 살아있기 때문에 GC가 되지 않아,
Memory Leak 이 발생할 수 있다고 한다
이를 해결하려면 익명, 로컬 및 내부 클래스 대신 정적 중첩 클래스를 사용하거나 최상위 클래스를
사용해야 한다고 한다.
그러나 문제점으로 UI View 또는 멤버 변수에 접근하지 못한다는 것인데,
이에 솔루션으로 WeakReference 를 만들어 준다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | public class MyActivity extends AppCompatActivity { int mSomeMemberVariable = 123; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // start the AsyncTask, passing the Activity context // in to a custom constructor new MyTask(this).execute(); } private static class MyTask extends AsyncTask<Void, Void, String> { private WeakReference<MyActivity> activityReference; // only retain a weak reference to the activity MyTask(MyActivity context) { activityReference = new WeakReference<>(context); } @Override protected String doInBackground(Void... params) { // do some long running task... return "task finished"; } @Override protected void onPostExecute(String result) { // get a reference to the activity if it is still there MyActivity activity = activityReference.get(); if (activity == null || activity.isFinishing()) return; // modify the activity's UI TextView textView = activity.findViewById(R.id.textview); textView.setText(result); // access Activity member variables activity.mSomeMemberVariable = 321; } } } | cs |
+ Reference
반응형
'프로그래밍 > Android' 카테고리의 다른 글
[Android] 3.1.0 업데이트 이후 DataBinding 생성 실패 (0) | 2018.07.16 |
---|---|
[Android] Android 3.1 suck (0) | 2018.03.30 |
[Android] Glide clear cache (0) | 2018.01.23 |
[Android] Retrofit, POST parameters (0) | 2018.01.18 |
[Android] ScrollView 에서 Expand (0) | 2017.12.27 |
공지사항
최근에 올라온 글