commit a98751f74deeb268d62fe35a8a81706d38632057
parent f53d96233acbf6d6b77cc8b8f3a87e7211329545
Author: gstraube <gstraube@mailbox.org>
Date: Thu, 25 May 2017 12:32:50 +0200
Use inner static classes to prevent memory leaks
Diffstat:
1 file changed, 40 insertions(+), 14 deletions(-)
diff --git a/app/src/main/java/com/github/cythara/MainActivity.java b/app/src/main/java/com/github/cythara/MainActivity.java
@@ -7,6 +7,8 @@ import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.widget.TextView;
+import java.lang.ref.WeakReference;
+
import be.tarsos.dsp.AudioDispatcher;
import be.tarsos.dsp.AudioEvent;
import be.tarsos.dsp.pitch.McLeodPitchMethod;
@@ -23,23 +25,30 @@ public class MainActivity extends AppCompatActivity {
private static final int BUFFER_SIZE = McLeodPitchMethod.DEFAULT_BUFFER_SIZE * 7;
private static final int OVERLAP = McLeodPitchMethod.DEFAULT_OVERLAP;
- final Handler myHandler = new Handler() {
-
- public void handleMessage(Message msg) {
- final TextView pitchText = (TextView) findViewById(R.id.pitch);
-
- pitchText.setText(msg.getData().getString("pitch"));
- }
- };
+ final Handler updateHandler = new UpdateHandler(this);
+ final PitchListener pitchListener = new PitchListener(this);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
- Runnable runnable = new Runnable() {
- @Override
- public void run() {
+ new Thread(pitchListener).start();
+ }
+
+ private static class PitchListener implements Runnable {
+
+ private final WeakReference<MainActivity> mainActivity;
+
+ PitchListener(MainActivity activity) {
+ mainActivity = new WeakReference<>(activity);
+ }
+
+ @Override
+ public void run() {
+ final MainActivity activity = mainActivity.get();
+
+ if (activity != null) {
PitchDetectionHandler pitchDetectionHandler = new PitchDetectionHandler() {
@Override
public void handlePitch(PitchDetectionResult pitchDetectionResult,
@@ -51,7 +60,7 @@ public class MainActivity extends AppCompatActivity {
Bundle bundle = new Bundle();
bundle.putString("pitch", String.valueOf(pitch));
message.setData(bundle);
- myHandler.sendMessage(message);
+ activity.updateHandler.sendMessage(message);
Log.d("com.github.cythara", "Pitch: " + pitch);
}
@@ -68,8 +77,25 @@ public class MainActivity extends AppCompatActivity {
audioDispatcher.run();
}
- };
+ }
+ }
+
+ private static class UpdateHandler extends Handler {
+
+ private final WeakReference<MainActivity> mainActivity;
+
+ UpdateHandler(MainActivity activity) {
+ mainActivity = new WeakReference<>(activity);
+ }
- new Thread(runnable).start();
+ public void handleMessage(Message msg) {
+ MainActivity activity = mainActivity.get();
+
+ if (activity != null) {
+ TextView pitchText = (TextView) activity.findViewById(R.id.pitch);
+
+ pitchText.setText(msg.getData().getString("pitch"));
+ }
+ }
}
}