From 5fcfa88ae0927bcc49f2c3c4e24a9bebd830cafd Mon Sep 17 00:00:00 2001 From: TonyJiangWJ Date: Tue, 7 Dec 2021 22:43:36 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81=EF=BC=9A?= =?UTF-8?q?=E8=A7=A3=E5=86=B3JSView=E7=9A=84=E5=86=85=E5=AD=98=E6=B3=84?= =?UTF-8?q?=E9=9C=B2=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../autojs/core/graphics/ScriptCanvasView.kt | 16 ++++++++++---- .../capture/ScreenCaptureRequestActivity.java | 2 +- .../ui/inflater/DynamicLayoutInflater.java | 6 ++++- .../autojs/core/ui/widget/JsListView.java | 22 +++++++++++++++++++ .../autojs/core/util/ScriptPromiseAdapter.kt | 9 ++++++-- .../engine/LoopBasedJavaScriptEngine.java | 3 --- .../stardust/autojs/runtime/api/Timers.java | 7 +++--- .../com/stardust/autojs/runtime/api/UI.java | 2 +- .../java/com/stardust/lang/ThreadCompat.java | 2 -- 9 files changed, 51 insertions(+), 18 deletions(-) diff --git a/autojs/src/main/java/com/stardust/autojs/core/graphics/ScriptCanvasView.kt b/autojs/src/main/java/com/stardust/autojs/core/graphics/ScriptCanvasView.kt index 77a67862..2cfbb381 100644 --- a/autojs/src/main/java/com/stardust/autojs/core/graphics/ScriptCanvasView.kt +++ b/autojs/src/main/java/com/stardust/autojs/core/graphics/ScriptCanvasView.kt @@ -20,10 +20,11 @@ import java.util.concurrent.Executors */ @SuppressLint("ViewConstructor") -class ScriptCanvasView(context: Context, private val mScriptRuntime: ScriptRuntime) : TextureView(context), TextureView.SurfaceTextureListener { +class ScriptCanvasView(context: Context, scriptRuntime: ScriptRuntime) : TextureView(context), TextureView.SurfaceTextureListener { @Volatile private var mDrawing = true - private val mEventEmitter: EventEmitter = EventEmitter(mScriptRuntime.bridges) + private val mEventEmitter: EventEmitter = EventEmitter(scriptRuntime.bridges) + private var mScriptRuntime: ScriptRuntime? = null private var mDrawingThreadPool: ExecutorService? = null @Volatile private var mTimePerDraw = (1000 / 30).toLong() @@ -33,6 +34,7 @@ class ScriptCanvasView(context: Context, private val mScriptRuntime: ScriptRunti init { surfaceTextureListener = this + mScriptRuntime = scriptRuntime } fun setMaxFps(maxFps: Int) { @@ -53,7 +55,7 @@ class ScriptCanvasView(context: Context, private val mScriptRuntime: ScriptRunti var time = SystemClock.uptimeMillis() val scriptCanvas = ScriptCanvas() try { - while (mDrawing && !mScriptRuntime.isStopped) { + while (mDrawing && !mScriptRuntime?.isStopped!!) { canvas = lockCanvas() scriptCanvas.setCanvas(canvas) emit("draw", scriptCanvas, this@ScriptCanvasView) @@ -66,7 +68,7 @@ class ScriptCanvasView(context: Context, private val mScriptRuntime: ScriptRunti time = SystemClock.uptimeMillis() } } catch (e: Exception) { - mScriptRuntime.exit(e) + mScriptRuntime?.exit(e) mDrawing = false } finally { if (canvas != null) { @@ -158,6 +160,7 @@ class ScriptCanvasView(context: Context, private val mScriptRuntime: ScriptRunti override fun onSurfaceTextureDestroyed(surface: SurfaceTexture): Boolean { mDrawing = false mDrawingThreadPool?.shutdown() + mScriptRuntime = null Log.d(LOG_TAG, "onSurfaceTextureDestroyed: ${this}") return true } @@ -166,6 +169,11 @@ class ScriptCanvasView(context: Context, private val mScriptRuntime: ScriptRunti } + override fun onDetachedFromWindow() { + super.onDetachedFromWindow() + mScriptRuntime = null + } + companion object { private const val LOG_TAG = "ScriptCanvasView" diff --git a/autojs/src/main/java/com/stardust/autojs/core/image/capture/ScreenCaptureRequestActivity.java b/autojs/src/main/java/com/stardust/autojs/core/image/capture/ScreenCaptureRequestActivity.java index 2230a106..4905b6f1 100644 --- a/autojs/src/main/java/com/stardust/autojs/core/image/capture/ScreenCaptureRequestActivity.java +++ b/autojs/src/main/java/com/stardust/autojs/core/image/capture/ScreenCaptureRequestActivity.java @@ -52,12 +52,12 @@ public class ScreenCaptureRequestActivity extends Activity { @Override protected void onDestroy() { super.onDestroy(); + IntentExtras.fromIntentAndRelease(getIntent()); mCallback = null; if (mScreenCaptureRequester == null) return; mScreenCaptureRequester.cancel(); mScreenCaptureRequester = null; - IntentExtras.fromIntentAndRelease(getIntent()); } @Override diff --git a/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/DynamicLayoutInflater.java b/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/DynamicLayoutInflater.java index 37c0b4fb..300a5e3a 100644 --- a/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/DynamicLayoutInflater.java +++ b/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/DynamicLayoutInflater.java @@ -357,5 +357,9 @@ public class DynamicLayoutInflater { return value.indexOf("}}", i + 1) >= 0; } - + public void recycle() { + setContext(null); + mViewAttrSetters.clear(); + mViewCreators.clear(); + } } diff --git a/autojs/src/main/java/com/stardust/autojs/core/ui/widget/JsListView.java b/autojs/src/main/java/com/stardust/autojs/core/ui/widget/JsListView.java index 0e849373..66325f9a 100644 --- a/autojs/src/main/java/com/stardust/autojs/core/ui/widget/JsListView.java +++ b/autojs/src/main/java/com/stardust/autojs/core/ui/widget/JsListView.java @@ -15,6 +15,7 @@ import org.w3c.dom.NodeList; import com.stardust.autojs.workground.WrapContentLinearLayoutManager; +import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; /** @@ -130,6 +131,12 @@ public class JsListView extends RecyclerView { } + @Override + public void onDetachedFromWindow() { + super.onDetachedFromWindow(); + mScriptRuntime = null; + } + private class Adapter extends RecyclerView.Adapter { @Override @@ -147,6 +154,9 @@ public class JsListView extends RecyclerView { @Override public void onBindViewHolder(ViewHolder holder, int position) { + if (mScriptRuntime == null) { + return; + } try { Object oldCtx = mScriptRuntime.ui.getBindingContext(); Object item = mDataSourceAdapter.getItem(mDataSource, position); @@ -183,6 +193,18 @@ public class JsListView extends RecyclerView { : mDataSourceAdapter == null ? 0 : mDataSourceAdapter.getItemCount(mDataSource); } + + @Override + public void onViewDetachedFromWindow(@NonNull ViewHolder holder) { + super.onViewDetachedFromWindow(holder); + mScriptRuntime = null; + } + + @Override + public void onViewRecycled(@NonNull ViewHolder holder) { + super.onViewRecycled(holder); + mScriptRuntime = null; + } } } diff --git a/autojs/src/main/java/com/stardust/autojs/core/util/ScriptPromiseAdapter.kt b/autojs/src/main/java/com/stardust/autojs/core/util/ScriptPromiseAdapter.kt index 3e116da5..75d3338b 100644 --- a/autojs/src/main/java/com/stardust/autojs/core/util/ScriptPromiseAdapter.kt +++ b/autojs/src/main/java/com/stardust/autojs/core/util/ScriptPromiseAdapter.kt @@ -1,7 +1,5 @@ package com.stardust.autojs.core.util -import com.stardust.autojs.core.internal.Functions - class ScriptPromiseAdapter { interface Callback { @@ -36,11 +34,18 @@ class ScriptPromiseAdapter { fun resolve(result: Any?) { mResult = result mResolveCallback?.call(result) + releaseCallbacks() } fun reject(error: Any?) { mError = error mRejectCallback?.call(error) + releaseCallbacks() + } + + fun releaseCallbacks() { + mResolveCallback = null + mRejectCallback = null } companion object { diff --git a/autojs/src/main/java/com/stardust/autojs/engine/LoopBasedJavaScriptEngine.java b/autojs/src/main/java/com/stardust/autojs/engine/LoopBasedJavaScriptEngine.java index 9c118f70..96c0825e 100644 --- a/autojs/src/main/java/com/stardust/autojs/engine/LoopBasedJavaScriptEngine.java +++ b/autojs/src/main/java/com/stardust/autojs/engine/LoopBasedJavaScriptEngine.java @@ -4,13 +4,10 @@ import android.app.Activity; import android.content.Context; import android.os.Handler; import android.os.Looper; -import android.os.MessageQueue; -import android.util.Log; import com.stardust.autojs.core.looper.LooperHelper; import com.stardust.autojs.script.JavaScriptSource; import com.stardust.autojs.script.ScriptSource; -import com.stardust.util.Callback; import org.mozilla.javascript.ContinuationPending; diff --git a/autojs/src/main/java/com/stardust/autojs/runtime/api/Timers.java b/autojs/src/main/java/com/stardust/autojs/runtime/api/Timers.java index 233fafad..72f6379d 100644 --- a/autojs/src/main/java/com/stardust/autojs/runtime/api/Timers.java +++ b/autojs/src/main/java/com/stardust/autojs/runtime/api/Timers.java @@ -1,14 +1,10 @@ package com.stardust.autojs.runtime.api; -import android.os.Handler; import android.os.Looper; import android.os.SystemClock; -import android.util.Log; -import android.util.SparseArray; import com.stardust.autojs.core.looper.Timer; import com.stardust.autojs.core.looper.TimerThread; -import com.stardust.autojs.runtime.ScriptBridges; import com.stardust.autojs.runtime.ScriptRuntime; import com.stardust.concurrent.VolatileBox; @@ -90,6 +86,9 @@ public class Timers { public void recycle() { mMainTimer.removeAllCallbacks(); + mUiTimer.removeAllCallbacks(); + mUiTimer = null; + mMainTimer = null; } } diff --git a/autojs/src/main/java/com/stardust/autojs/runtime/api/UI.java b/autojs/src/main/java/com/stardust/autojs/runtime/api/UI.java index 4a7e1314..7337dfdf 100644 --- a/autojs/src/main/java/com/stardust/autojs/runtime/api/UI.java +++ b/autojs/src/main/java/com/stardust/autojs/runtime/api/UI.java @@ -103,7 +103,7 @@ public class UI extends ProxyObject { } public void recycle() { - mDynamicLayoutInflater.setContext(null); + mDynamicLayoutInflater.recycle(); mRuntime = null; } diff --git a/common/src/main/java/com/stardust/lang/ThreadCompat.java b/common/src/main/java/com/stardust/lang/ThreadCompat.java index f8444a1d..63398feb 100644 --- a/common/src/main/java/com/stardust/lang/ThreadCompat.java +++ b/common/src/main/java/com/stardust/lang/ThreadCompat.java @@ -1,8 +1,6 @@ package com.stardust.lang; -import java.lang.ref.WeakReference; import java.util.Collections; -import java.util.Hashtable; import java.util.Set; import java.util.WeakHashMap;