2019年5月3日金曜日

android開発 メモリリークを防ぐWeakReference

2019 May 03.


FirstActivity.java
(OnClickListener等は省略)


  1. public class FirstActivity extends AppCompatActivity {
  2. Button button1 = (Button) findViewById(R.id.button1);
  3. button1.setEnabled(true);
  4. TextView textView1 = (TextView) findViewById(R.id.textView1);
  5. textView1.setText("start")
  6.  
  7. new SecondTask(this).execute();
  8. }

SecondTask.java
  1. public class SecondTask extends AsyncTask {
  2. private WeakReference weakReference;
  3.  
  4. /**
  5. * make WeakReference in constructor
  6. * 参照しているActivityを引数にしてWeakReferenceのインスタンスを生成する
  7. **/
  8. SecondTask(Context referenceContext) {
  9. private WeakReference weakReference;
  10. weakReference = new WeakReference<>(referenceContext);
  11. }
  12.  
  13. /**
  14. * use of WeakReference in onPostExecute
  15. * weakReference.get()で参照しているActivityのContextを取得し、それを通じてView を設定したりする
  16. **/
  17. @Override
  18. protected void onPostExecute(String result) {
  19. Activity activity = (Activity) weakReference.get();
  20.  
  21. if (activity == null || activity.isFinishing()) return;
  22.  
  23. activity.findViewById(R.id.button1).setEnabled(false);
  24. TextView tv = activity.findViewById(R.id.textView1);
  25. tv.setText("end");
  26. }
  27. }

0 件のコメント:

コメントを投稿