├── .gitignore ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── nimbledroid │ │ └── memoryleaks │ │ └── ApplicationTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── nimbledroid │ │ │ └── memoryleaks │ │ │ ├── DestinationActivity.java │ │ │ └── MainActivity.java │ └── res │ │ ├── drawable │ │ └── background.png │ │ ├── layout │ │ ├── activity_destination.xml │ │ └── activity_main.xml │ │ ├── mipmap-hdpi │ │ └── ic_launcher.png │ │ ├── mipmap-mdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xhdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xxhdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xxxhdpi │ │ └── ic_launcher.png │ │ ├── values-w820dp │ │ └── dimens.xml │ │ └── values │ │ ├── colors.xml │ │ ├── dimens.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── test │ └── java │ └── com │ └── nimbledroid │ └── memoryleaks │ └── ExampleUnitTest.java ├── build.gradle ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | local.properties 4 | gradle.properties 5 | .idea 6 | .DS_Store 7 | /build 8 | /captures 9 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | compileSdkVersion 23 5 | buildToolsVersion "23.0.3" 6 | 7 | defaultConfig { 8 | applicationId "com.nimbledroid.memoryleaks" 9 | minSdkVersion 19 10 | targetSdkVersion 23 11 | versionCode 1 12 | versionName "1.0" 13 | } 14 | buildTypes { 15 | release { 16 | minifyEnabled false 17 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 18 | } 19 | } 20 | } 21 | 22 | dependencies { 23 | compile fileTree(dir: 'libs', include: ['*.jar']) 24 | testCompile 'junit:junit:4.12' 25 | compile 'com.android.support:appcompat-v7:23.3.0' 26 | compile 'com.android.support:gridlayout-v7:23.3.0' 27 | } 28 | -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in /Users/tom/Library/Android/sdk/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | -------------------------------------------------------------------------------- /app/src/androidTest/java/com/nimbledroid/memoryleaks/ApplicationTest.java: -------------------------------------------------------------------------------- 1 | package com.nimbledroid.memoryleaks; 2 | 3 | import android.app.Application; 4 | import android.test.ApplicationTestCase; 5 | 6 | /** 7 | * Testing Fundamentals 8 | */ 9 | public class ApplicationTest extends ApplicationTestCase { 10 | public ApplicationTest() { 11 | super(Application.class); 12 | } 13 | } -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /app/src/main/java/com/nimbledroid/memoryleaks/DestinationActivity.java: -------------------------------------------------------------------------------- 1 | package com.nimbledroid.memoryleaks; 2 | 3 | import android.support.v7.app.AppCompatActivity; 4 | import android.os.Bundle; 5 | 6 | public class DestinationActivity extends AppCompatActivity { 7 | 8 | @Override 9 | protected void onCreate(Bundle savedInstanceState) { 10 | super.onCreate(savedInstanceState); 11 | setContentView(R.layout.activity_destination); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /app/src/main/java/com/nimbledroid/memoryleaks/MainActivity.java: -------------------------------------------------------------------------------- 1 | package com.nimbledroid.memoryleaks; 2 | 3 | import android.content.Intent; 4 | import android.hardware.Sensor; 5 | import android.hardware.SensorEvent; 6 | import android.hardware.SensorEventListener; 7 | import android.hardware.SensorManager; 8 | import android.os.AsyncTask; 9 | import android.os.Bundle; 10 | import android.os.Handler; 11 | import android.os.Message; 12 | import android.os.SystemClock; 13 | import android.support.v7.app.AppCompatActivity; 14 | import android.view.View; 15 | 16 | import java.util.Timer; 17 | import java.util.TimerTask; 18 | 19 | public class MainActivity extends AppCompatActivity implements SensorEventListener { 20 | 21 | private static MainActivity activity; 22 | private static Object inner; 23 | private static View view; 24 | 25 | @Override 26 | protected void onCreate(Bundle savedInstanceState) { 27 | super.onCreate(savedInstanceState); 28 | setContentView(R.layout.activity_main); 29 | View aicButton = findViewById(R.id.at_button); 30 | aicButton.setOnClickListener(new View.OnClickListener() { 31 | @Override public void onClick(View v) { 32 | startAsyncTask(); 33 | nextActivity(); 34 | } 35 | }); 36 | View saButton = findViewById(R.id.sa_button); 37 | saButton.setOnClickListener(new View.OnClickListener() { 38 | @Override public void onClick(View v) { 39 | setStaticActivity(); 40 | nextActivity(); 41 | } 42 | }); 43 | View hButton = findViewById(R.id.h_button); 44 | hButton.setOnClickListener(new View.OnClickListener() { 45 | @Override public void onClick(View v) { 46 | createHandler(); 47 | nextActivity(); 48 | } 49 | }); 50 | View icButton = findViewById(R.id.ic_button); 51 | icButton.setOnClickListener(new View.OnClickListener() { 52 | @Override public void onClick(View v) { 53 | createInnerClass(); 54 | nextActivity(); 55 | } 56 | }); 57 | View svButton = findViewById(R.id.sv_button); 58 | svButton.setOnClickListener(new View.OnClickListener() { 59 | @Override public void onClick(View v) { 60 | setStaticView(); 61 | nextActivity(); 62 | } 63 | }); 64 | View smButton = findViewById(R.id.sm_button); 65 | smButton.setOnClickListener(new View.OnClickListener() { 66 | @Override public void onClick(View v) { 67 | registerListener(); 68 | nextActivity(); 69 | } 70 | }); 71 | View tButton = findViewById(R.id.t_button); 72 | tButton.setOnClickListener(new View.OnClickListener() { 73 | @Override public void onClick(View v) { 74 | spawnThread(); 75 | nextActivity(); 76 | } 77 | }); 78 | View ttButton = findViewById(R.id.tt_button); 79 | ttButton.setOnClickListener(new View.OnClickListener() { 80 | @Override public void onClick(View v) { 81 | scheduleTimer(); 82 | nextActivity(); 83 | } 84 | }); 85 | } 86 | 87 | @Override 88 | public void onSensorChanged(SensorEvent event) { 89 | } 90 | 91 | @Override 92 | public void onAccuracyChanged(Sensor sensor, int accuracy) { 93 | } 94 | 95 | void nextActivity() { 96 | Intent intent = new Intent(this, DestinationActivity.class); 97 | startActivity(intent); 98 | SystemClock.sleep(600); 99 | finish(); 100 | } 101 | 102 | void startAsyncTask() { 103 | new AsyncTask() { 104 | @Override protected Void doInBackground(Void... params) { 105 | while(true); 106 | } 107 | }.execute(); 108 | } 109 | 110 | void setStaticActivity() { 111 | activity = this; 112 | } 113 | 114 | void createHandler() { 115 | new Handler() { 116 | @Override public void handleMessage(Message message) { 117 | super.handleMessage(message); 118 | } 119 | }.postDelayed(new Runnable() { 120 | @Override public void run() { 121 | while(true); 122 | } 123 | }, Long.MAX_VALUE >> 1); 124 | } 125 | 126 | void createInnerClass() { 127 | class InnerClass { 128 | } 129 | inner = new InnerClass(); 130 | } 131 | 132 | void setStaticView() { 133 | view = findViewById(R.id.sv_button); 134 | } 135 | 136 | void registerListener() { 137 | SensorManager sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); 138 | Sensor sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ALL); 139 | sensorManager.registerListener(this, sensor, SensorManager.SENSOR_DELAY_FASTEST); 140 | } 141 | 142 | void spawnThread() { 143 | new Thread() { 144 | @Override public void run() { 145 | while(true); 146 | } 147 | }.start(); 148 | } 149 | 150 | void scheduleTimer() { 151 | new Timer().schedule(new TimerTask() { 152 | @Override 153 | public void run() { 154 | while(true); 155 | } 156 | }, Long.MAX_VALUE >> 1); 157 | } 158 | } 159 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NimbleDroid/Memory-Leaks/3a42ca9634addf1861ef40903b153042acd511e4/app/src/main/res/drawable/background.png -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_destination.xml: -------------------------------------------------------------------------------- 1 | 2 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 14 |