fix: VolatileBox dead lock issue

This commit is contained in:
hyb1996
2017-10-28 15:46:03 +08:00
parent 02a9091ddb
commit 716a44fb6f
4 changed files with 58 additions and 4 deletions

View File

@@ -9,8 +9,8 @@ android {
applicationId "com.stardust.scriptdroid"
minSdkVersion 17
targetSdkVersion 23
versionCode 214
versionName "3.0.0 Alpha15"
versionCode 215
versionName "3.0.0 Alpha16"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
multiDexEnabled true
ndk {

View File

@@ -27,6 +27,7 @@ import com.stardust.autojs.runtime.exception.ScriptInterruptedException;
import com.stardust.autojs.core.accessibility.SimpleActionAutomator;
import com.stardust.concurrent.VolatileBox;
import com.stardust.autojs.runtime.api.UI;
import com.stardust.concurrent.VolatileDispose;
import com.stardust.pio.UncheckedIOException;
import com.stardust.util.ClipboardUtil;
import com.stardust.autojs.core.util.ProcessShell;
@@ -237,7 +238,7 @@ public class ScriptRuntime {
if (Looper.myLooper() == Looper.getMainLooper()) {
return ClipboardUtil.getClipOrEmpty(mUiHandler.getContext()).toString();
}
final VolatileBox<String> clip = new VolatileBox<>("");
final VolatileDispose<String> clip = new VolatileDispose<>();
mUiHandler.post(new Runnable() {
@Override
public void run() {

View File

@@ -11,6 +11,7 @@ import android.support.annotation.RequiresApi;
import android.view.ViewConfiguration;
import com.stardust.concurrent.VolatileBox;
import com.stardust.concurrent.VolatileDispose;
import com.stardust.util.ScreenMetrics;
/**
@@ -110,7 +111,7 @@ public class GlobalActionAutomator {
@RequiresApi(api = Build.VERSION_CODES.N)
private boolean gesturesWithHandler(GestureDescription description) {
final VolatileBox<Boolean> result = new VolatileBox<>(false);
final VolatileDispose<Boolean> result = new VolatileDispose<>();
mService.dispatchGesture(description, new AccessibilityService.GestureResultCallback() {
@Override
public void onCompleted(GestureDescription gestureDescription) {

View File

@@ -0,0 +1,52 @@
package com.stardust.concurrent;
/**
* Created by Stardust on 2017/10/28.
*/
public class VolatileDispose<T> {
private volatile T mValue;
public T blockedGet() {
synchronized (this) {
if (mValue != null) {
return mValue;
}
try {
this.wait();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
return mValue;
}
public T blockedGetOrThrow(Class<? extends RuntimeException> exception) {
synchronized (this) {
if (mValue != null) {
return mValue;
}
try {
this.wait();
} catch (InterruptedException e) {
try {
throw exception.newInstance();
} catch (InstantiationException e1) {
throw new RuntimeException(e1);
} catch (IllegalAccessException e1) {
throw new RuntimeException(e1);
}
}
}
return mValue;
}
public void setAndNotify(T value) {
synchronized (this) {
mValue = value;
notify();
}
}
}