Skip to content

Commit db2c796

Browse files
committed
修复内存泄漏问题
1 parent 57a8b27 commit db2c796

File tree

7 files changed

+163
-28
lines changed

7 files changed

+163
-28
lines changed

app/build.gradle

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,5 +25,8 @@ dependencies {
2525
compile 'com.android.support:appcompat-v7:25.3.1'
2626
compile project(path: ':library')
2727
compile 'com.github.Jay-Goo:AndroidMP3Recorder:v1.0.7'
28-
28+
//内存泄漏检测
29+
debugCompile 'com.squareup.leakcanary:leakcanary-android:1.5'
30+
releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5'
31+
testCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5'
2932
}

app/src/main/AndroidManifest.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
package="jaygoo.wavelineview">
44

55
<application
6+
android:name=".App"
67
android:allowBackup="true"
78
android:icon="@mipmap/ic_launcher"
89
android:label="@string/app_name"
@@ -17,6 +18,10 @@
1718
<category android:name="android.intent.category.LAUNCHER"/>
1819
</intent-filter>
1920
</activity>
21+
22+
<activity android:name=".LeakTestActivity"
23+
>
24+
</activity>
2025
</application>
2126

2227
</manifest>
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package jaygoo.wavelineview;
2+
3+
import android.app.Application;
4+
5+
import com.squareup.leakcanary.LeakCanary;
6+
7+
8+
/**
9+
* ================================================
10+
* 作 者:JayGoo
11+
* 版 本:
12+
* 创建日期:2017/7/28
13+
* 描 述:
14+
* ================================================
15+
*/
16+
public class App extends Application {
17+
@Override
18+
public void onCreate() {
19+
super.onCreate();
20+
if (LeakCanary.isInAnalyzerProcess(this)) {
21+
return;
22+
}
23+
LeakCanary.install(this);
24+
}
25+
}
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
package jaygoo.wavelineview;
2+
3+
import android.app.Activity;
4+
import android.content.Intent;
5+
import android.os.Bundle;
6+
import android.view.View;
7+
8+
import jaygoo.widget.wlv.WaveLineView;
9+
10+
/**
11+
* ================================================
12+
* 作 者:JayGoo
13+
* 版 本:
14+
* 创建日期:2017/7/31
15+
* 描 述:
16+
* ================================================
17+
*/
18+
public class LeakTestActivity extends Activity{
19+
private WaveLineView waveLineView;
20+
21+
@Override
22+
protected void onCreate(Bundle savedInstanceState) {
23+
super.onCreate(savedInstanceState);
24+
setContentView(R.layout.activity_main);
25+
waveLineView = (WaveLineView) findViewById(R.id.waveLineView);
26+
27+
findViewById(R.id.startBtn).setOnClickListener(new View.OnClickListener() {
28+
@Override
29+
public void onClick(View v) {
30+
waveLineView.startAnim();
31+
}
32+
});
33+
34+
findViewById(R.id.stopBtn).setOnClickListener(new View.OnClickListener() {
35+
@Override
36+
public void onClick(View v) {
37+
waveLineView.stopAnim();
38+
39+
}
40+
});
41+
42+
findViewById(R.id.leakTestBtn).setOnClickListener(new View.OnClickListener() {
43+
@Override
44+
public void onClick(View v) {
45+
finish();
46+
startActivity(new Intent(LeakTestActivity.this,MainActivity.class));
47+
}
48+
});
49+
}
50+
51+
52+
@Override
53+
protected void onResume() {
54+
super.onResume();
55+
waveLineView.onResume(true);
56+
}
57+
58+
@Override
59+
protected void onPause() {
60+
super.onPause();
61+
waveLineView.onPause();
62+
}
63+
64+
@Override
65+
protected void onDestroy() {
66+
super.onDestroy();
67+
waveLineView.release();
68+
}
69+
}

app/src/main/java/jaygoo/wavelineview/MainActivity.java

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package jaygoo.wavelineview;
22

3+
import android.content.Intent;
34
import android.os.Bundle;
45
import android.support.v7.app.AppCompatActivity;
6+
import android.util.Log;
57
import android.view.View;
68

79
import jaygoo.widget.wlv.WaveLineView;
@@ -27,6 +29,15 @@ public void onClick(View v) {
2729
@Override
2830
public void onClick(View v) {
2931
waveLineView.stopAnim();
32+
33+
}
34+
});
35+
36+
findViewById(R.id.leakTestBtn).setOnClickListener(new View.OnClickListener() {
37+
@Override
38+
public void onClick(View v) {
39+
finish();
40+
startActivity(new Intent(MainActivity.this,LeakTestActivity.class));
3041
}
3142
});
3243
}
@@ -35,14 +46,13 @@ public void onClick(View v) {
3546
@Override
3647
protected void onResume() {
3748
super.onResume();
38-
waveLineView.onResume(true);
49+
waveLineView.onResume(true);
3950
}
4051

4152
@Override
4253
protected void onPause() {
4354
super.onPause();
44-
waveLineView.onPause();
45-
55+
waveLineView.onPause();
4656
}
4757

4858
@Override

app/src/main/res/layout/activity_main.xml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,4 +33,13 @@
3333
android:layout_height="wrap_content"
3434
android:text="stop"
3535
/>
36+
37+
<Button
38+
android:id="@+id/leakTestBtn"
39+
android:layout_marginTop="20dp"
40+
android:layout_gravity="center"
41+
android:text="Memory Leak Test"
42+
android:padding="10dp"
43+
android:layout_width="wrap_content"
44+
android:layout_height="wrap_content"/>
3645
</LinearLayout>

library/src/main/java/jaygoo/widget/wlv/RenderView.java

Lines changed: 38 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@
33
import android.content.Context;
44
import android.graphics.Canvas;
55
import android.util.AttributeSet;
6-
import android.util.Log;
76
import android.view.SurfaceHolder;
87
import android.view.SurfaceView;
98

9+
import java.lang.ref.WeakReference;
1010
import java.util.List;
1111
/**
1212
* ================================================
@@ -33,31 +33,37 @@ public RenderView(Context context, AttributeSet attrs, int defStyleAttr) {
3333
getHolder().addCallback(this);
3434
}
3535

36-
/*回调/线程*/
3736

38-
private class RenderThread extends Thread {
37+
/*回调/线程*/
38+
private static class RenderThread extends Thread {
3939

4040
private static final long SLEEP_TIME = 16;
41-
42-
private SurfaceHolder surfaceHolder;
41+
private WeakReference<RenderView> renderView;
4342
private boolean running = false;
4443
private boolean destoryed = false;
4544
private boolean isPause = false;
46-
public RenderThread(SurfaceHolder holder) {
45+
public RenderThread(RenderView renderView) {
4746
super("RenderThread");
48-
surfaceHolder = holder;
47+
this.renderView = new WeakReference<>(renderView);
48+
}
49+
50+
private SurfaceHolder getSurfaceHolder(){
51+
if (getRenderView() != null ){
52+
return getRenderView().getHolder();
53+
}
54+
return null;
55+
}
56+
57+
private RenderView getRenderView(){
58+
return renderView.get();
4959
}
5060

5161
@Override
5262
public void run() {
5363
long startAt = System.currentTimeMillis();
54-
while (true) {
64+
while (!destoryed) {
5565
synchronized (surfaceLock) {
5666

57-
if (destoryed){
58-
return;
59-
}
60-
6167
//这里并没有真正的结束Thread,防止部分手机连续调用同一Thread出错
6268
while (isPause){
6369
try {
@@ -68,28 +74,36 @@ public void run() {
6874
}
6975

7076
if (running) {
71-
Canvas canvas = surfaceHolder.lockCanvas();
72-
if (canvas != null) {
73-
render(canvas, System.currentTimeMillis() - startAt); //这里做真正绘制的事情
74-
surfaceHolder.unlockCanvasAndPost(canvas);
77+
if (getSurfaceHolder() != null && getRenderView() != null) {
78+
Canvas canvas = getSurfaceHolder().lockCanvas();
79+
if (canvas != null) {
80+
getRenderView().render(canvas, System.currentTimeMillis() - startAt); //这里做真正绘制的事情
81+
getSurfaceHolder().unlockCanvasAndPost(canvas);
82+
}
83+
}else {
84+
running = false;
85+
}
86+
try {
87+
Thread.sleep(SLEEP_TIME);
88+
} catch (InterruptedException e) {
89+
e.printStackTrace();
7590
}
7691
}
77-
try {
78-
Thread.sleep(SLEEP_TIME);
79-
} catch (InterruptedException e) {
80-
e.printStackTrace();
81-
}
92+
8293
}
94+
8395
}
96+
8497
}
8598

99+
86100
public void setRun(boolean isRun) {
87101
this.running = isRun;
88102
}
89103

90104
}
91105

92-
private final Object surfaceLock = new Object();
106+
private final static Object surfaceLock = new Object();
93107
private RenderThread renderThread;
94108

95109
@Override
@@ -99,7 +113,7 @@ public void surfaceCreated(SurfaceHolder holder) {
99113
throw new IllegalStateException();
100114
}
101115

102-
renderThread = new RenderThread(holder);
116+
renderThread = new RenderThread(this);
103117
}
104118

105119
/**
@@ -220,10 +234,10 @@ public boolean isRunning(){
220234

221235
//释放相关资源,防止内存泄漏
222236
public void release(){
223-
stopAnim();
224237
if (getHolder() != null && getHolder().getSurface() != null) {
225238
getHolder().getSurface().release();
226239
getHolder().removeCallback(this);
227240
}
228241
}
242+
229243
}

0 commit comments

Comments
 (0)