33import android .content .Context ;
44import android .graphics .Canvas ;
55import android .util .AttributeSet ;
6- import android .util .Log ;
76import android .view .SurfaceHolder ;
87import android .view .SurfaceView ;
98
9+ import java .lang .ref .WeakReference ;
1010import 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