rokkonet

PC・Androidソフトウェア・アプリの開発・使い方に関するメモ

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

2019 May 03.


FirstActivity.java
(OnClickListener等は省略)


public class FirstActivity extends AppCompatActivity {
Button button1 = (Button) findViewById(R.id.button1);
button1.setEnabled(true);
TextView textView1 = (TextView) findViewById(R.id.textView1);
textView1.setText("start")

new SecondTask(this).execute();
}

SecondTask.java
public class SecondTask extends AsyncTask {
private WeakReference weakReference;

/**
* make WeakReference in constructor
* 参照しているActivityを引数にしてWeakReferenceのインスタンスを生成する
**/
SecondTask(Context referenceContext) {
private WeakReference weakReference;
weakReference = new WeakReference<>(referenceContext);
}

/**
* use of WeakReference in onPostExecute
* weakReference.get()で参照しているActivityのContextを取得し、それを通じてView を設定したりする
**/
@Override
protected void onPostExecute(String result) {
Activity activity = (Activity) weakReference.get();

if (activity == null || activity.isFinishing()) return;

activity.findViewById(R.id.button1).setEnabled(false);
TextView tv = activity.findViewById(R.id.textView1);
tv.setText("end");
}
}