From a3ae30974218690c1f829be81aee31c1a4d7a660 Mon Sep 17 00:00:00 2001 From: hyb1996 <946994919@qq.com> Date: Sat, 15 Sep 2018 14:04:01 +0800 Subject: [PATCH] fix: app crash when a timer callback throws exception on main thread; feat: umeng ads --- .idea/caches/build_file_checksums.ser | Bin 733 -> 733 bytes app/build.gradle | 2 +- app/src/main/java/org/autojs/autojs/App.java | 2 - .../java/org/autojs/autojs/Constants.java | 20 ++-- app/src/main/java/org/autojs/autojs/Pref.java | 11 +- .../autojs/autojs/ui/build/BuildActivity.java | 95 +++--------------- .../autojs/ui/splash/SplashActivity.java | 86 +++++++--------- app/src/main/res/layout/activity_splash.xml | 4 + app/src/main/res/values/strings.xml | 2 + app/src/main/res/xml/preferences.xml | 8 +- .../stardust/autojs/core/looper/Timer.java | 31 ++++-- .../autojs/core/looper/TimerThread.java | 2 +- .../autojs/runtime/ScriptRuntime.java | 2 +- .../stardust/autojs/runtime/api/Timers.java | 9 +- autojs/src/main/res/values/arrays.xml | 16 +++ 15 files changed, 129 insertions(+), 161 deletions(-) diff --git a/.idea/caches/build_file_checksums.ser b/.idea/caches/build_file_checksums.ser index ba7e26c676407d54d6510623e973ca09a4153f2b..c8bc7e01b5e3e79cee11fb1d49ca23437aa5c8a9 100644 GIT binary patch delta 36 ucmV+<0NelF1>FUZm;~EjYvqxgcMuPHMnKVt_tV{1bJ035Pg}Di0lEP|77%~{ delta 36 ucmV+<0NelF1>FUZm;~0)C&rPScMu*@@U { - if (mAdLoading){ - enterNextActivity(); - } - }, 1500); - mInterstitialAd = new InterstitialAd(this); - mInterstitialAd.setAdUnitId(BuildConfig.DEBUG ? Constants.ADMOB_INTERSTITIAL_TEST_ID : Constants.ADMOB_INTERSTITIAL_ID); - mInterstitialAd.setAdListener(new AdListener() { + mFullScreenAdView.setFullScreenListener(this::enterNextActivity); + mFullScreenAdView.setLoadAdListener(new LoadAdListener() { @Override - public void onAdLoaded() { + public void onSuccess() { mAdLoading = false; - if(!mAlreadyEnterNextActivity){ - mInterstitialAd.show(); - } + Log.d(LOG_TAG, "onAdLoadSuccess"); } @Override - public void onAdClosed() { - enterNextActivity(); - } - - @Override - public void onAdClicked() { - enterNextActivity(); - } - - @Override - public void onAdFailedToLoad(int i) { + public void onFailure(String s) { mAdLoading = false; + Log.e(LOG_TAG, "onAdLoadFailure: " + s); enterNextActivity(); - Log.d(Constants.LOG_TAG_ADMOB, "Fail to load interstitial ad: " + i); } - }); - mInterstitialAd.loadAd(buildAdRequest()); + mHandler.postDelayed(() -> { + if (mAdLoading) { + enterNextActivity(); + } + }, 2000); + mFullScreenAdView.loadAd(getAdId(), false); } - private AdRequest buildAdRequest() { - AdRequest.Builder builder = new AdRequest.Builder(); - if (BuildConfig.DEBUG) { - builder.addTestDevice("774E105820188FA387B617ECD279B167"); - } - return builder.build(); + private String getAdId() { + int type = Pref.getAdType(); + int id = type >= 1 && type <= Constants.UMENG_IDS.length ? Constants.UMENG_IDS[type - 1] + : Constants.UMENG_IDS[new Random().nextInt(Constants.UMENG_IDS.length)]; + return String.valueOf(id); + } + + @Override + protected void onDestroy() { + super.onDestroy(); + mFullScreenAdView.clean(); } } diff --git a/app/src/main/res/layout/activity_splash.xml b/app/src/main/res/layout/activity_splash.xml index af6be7fa..b1674ead 100644 --- a/app/src/main/res/layout/activity_splash.xml +++ b/app/src/main/res/layout/activity_splash.xml @@ -13,6 +13,10 @@ android:layout_height="0dp" android:layout_weight="1"> + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 5b731f77..70d91311 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -387,4 +387,6 @@ 类/包名 查看文档 import + key_ad_type + 广告类型设置 diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml index 9ce4c321..64e91a68 100644 --- a/app/src/main/res/xml/preferences.xml +++ b/app/src/main/res/xml/preferences.xml @@ -93,9 +93,13 @@ - mHandlerCallbacks = new SparseArray<>(); private int mCallbackMaxId = 0; - private ScriptBridges mBridges; + private ScriptRuntime mRuntime; private Handler mHandler; private long mMaxCallbackUptimeMillis = 0; private final VolatileBox mMaxCallbackMillisForAllThread; - public Timer(ScriptBridges bridges, VolatileBox maxCallbackMillisForAllThread) { - mBridges = bridges; + public Timer(ScriptRuntime runtime, VolatileBox maxCallbackMillisForAllThread) { + mRuntime = runtime; mMaxCallbackMillisForAllThread = maxCallbackMillisForAllThread; mHandler = new Handler(); } - public Timer(ScriptBridges bridges, VolatileBox maxCallbackMillisForAllThread, Looper looper) { - mBridges = bridges; + public Timer(ScriptRuntime runtime, VolatileBox maxCallbackMillisForAllThread, Looper looper) { + mRuntime = runtime; mMaxCallbackMillisForAllThread = maxCallbackMillisForAllThread; mHandler = new Handler(looper); } @@ -40,7 +39,7 @@ public class Timer { mCallbackMaxId++; final int id = mCallbackMaxId; Runnable r = () -> { - mBridges.callFunction(callback, null, args); + callFunction(callback, null, args); mHandlerCallbacks.remove(id); }; mHandlerCallbacks.put(id, r); @@ -48,6 +47,18 @@ public class Timer { return id; } + private void callFunction(Object callback, Object thiz, Object[] args) { + if(Looper.myLooper() == Looper.getMainLooper()){ + try { + mRuntime.bridges.callFunction(callback, thiz, args); + }catch (Exception e){ + mRuntime.exit(e); + } + }else { + mRuntime.bridges.callFunction(callback, thiz, args); + } + } + public boolean clearTimeout(int id) { return clearCallback(id); } @@ -60,7 +71,7 @@ public class Timer { public void run() { if (mHandlerCallbacks.get(id) == null) return; - mBridges.callFunction(listener, null, args); + callFunction(listener, null, args); postDelayed(this, interval); } }; @@ -86,7 +97,7 @@ public class Timer { mCallbackMaxId++; final int id = mCallbackMaxId; Runnable r = () -> { - mBridges.callFunction(listener, null, args); + callFunction(listener, null, args); mHandlerCallbacks.remove(id); }; mHandlerCallbacks.put(id, r); diff --git a/autojs/src/main/java/com/stardust/autojs/core/looper/TimerThread.java b/autojs/src/main/java/com/stardust/autojs/core/looper/TimerThread.java index 2f7e834c..7dd75007 100644 --- a/autojs/src/main/java/com/stardust/autojs/core/looper/TimerThread.java +++ b/autojs/src/main/java/com/stardust/autojs/core/looper/TimerThread.java @@ -41,7 +41,7 @@ public class TimerThread extends ThreadCompat { @Override public void run() { mRuntime.loopers.prepare(); - mTimer = new Timer(mRuntime.bridges, mMaxCallbackUptimeMillisForAllThreads); + mTimer = new Timer(mRuntime, mMaxCallbackUptimeMillisForAllThreads); sTimerMap.put(Thread.currentThread(), mTimer); notifyRunning(); new Handler().post(mTarget); diff --git a/autojs/src/main/java/com/stardust/autojs/runtime/ScriptRuntime.java b/autojs/src/main/java/com/stardust/autojs/runtime/ScriptRuntime.java index 6c10ba22..525c45de 100644 --- a/autojs/src/main/java/com/stardust/autojs/runtime/ScriptRuntime.java +++ b/autojs/src/main/java/com/stardust/autojs/runtime/ScriptRuntime.java @@ -222,7 +222,7 @@ public class ScriptRuntime { if (loopers != null) throw new IllegalStateException("already initialized"); threads = new Threads(this); - timers = new Timers(bridges, threads); + timers = new Timers(this); loopers = new Loopers(this); events = new Events(uiHandler.getContext(), accessibilityBridge, this); mThread = Thread.currentThread(); 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 a7ca64d5..7c67e38f 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 @@ -9,6 +9,7 @@ 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; /** @@ -25,10 +26,10 @@ public class Timers { private Timer mUiTimer; - public Timers(ScriptBridges bridges, Threads threads) { - mMainTimer = new Timer(bridges, mMaxCallbackUptimeMillisForAllThreads); - mUiTimer = new Timer(bridges, mMaxCallbackUptimeMillisForAllThreads, Looper.getMainLooper()); - mThreads = threads; + public Timers(ScriptRuntime runtime) { + mMainTimer = new Timer(runtime, mMaxCallbackUptimeMillisForAllThreads); + mUiTimer = new Timer(runtime, mMaxCallbackUptimeMillisForAllThreads, Looper.getMainLooper()); + mThreads = runtime.threads; } public Timer getMainTimer() { diff --git a/autojs/src/main/res/values/arrays.xml b/autojs/src/main/res/values/arrays.xml index 8592c02f..5fb871c9 100644 --- a/autojs/src/main/res/values/arrays.xml +++ b/autojs/src/main/res/values/arrays.xml @@ -12,6 +12,22 @@ OncePerDay + + 随机 + 新闻 + 社交 + 动漫 + 游戏 + + + + 0 + 1 + 2 + 3 + 4 + + 可编辑的js文件