提交 14ed64d2 编写于 作者: B Blankj

see 12/04 log

上级 a9687d00
......@@ -41,7 +41,7 @@
[logo]: https://raw.githubusercontent.com/Blankj/AndroidUtilCode/master/art/logo.png
[aucSvg]: https://img.shields.io/badge/AndroidUtilCode-v1.22.0-brightgreen.svg
[aucSvg]: https://img.shields.io/badge/AndroidUtilCode-v1.22.1-brightgreen.svg
[auc]: https://github.com/Blankj/AndroidUtilCode
[apiSvg]: https://img.shields.io/badge/API-14+-brightgreen.svg
......
......@@ -41,7 +41,7 @@ If this project helps you a lot and you want to support the project's developmen
[logo]: https://raw.githubusercontent.com/Blankj/AndroidUtilCode/master/art/logo.png
[aucSvg]: https://img.shields.io/badge/AndroidUtilCode-v1.22.0-brightgreen.svg
[aucSvg]: https://img.shields.io/badge/AndroidUtilCode-v1.22.1-brightgreen.svg
[auc]: https://github.com/Blankj/AndroidUtilCode
[apiSvg]: https://img.shields.io/badge/API-14+-brightgreen.svg
......
{
"CloseAdaptActivity#start": "void com.blankj.androidutilcode.feature.core.adaptScreen.CloseAdaptActivity.start(android.content.Context)"
"CloseAdaptActivity#start": "void com.blankj.androidutilcode.feature.core.adaptScreen.CloseAdaptActivity.start(android.content.Context)",
"AdaptScreenActivity#start": "void com.blankj.androidutilcode.feature.core.adaptScreen.AdaptScreenActivityKt.start(android.content.Context)"
}
\ No newline at end of file
......@@ -21,5 +21,5 @@ dependencies {
// LeakCanary
debugImplementation dep.leakcanary.android
releaseImplementation dep.leakcanary.android_no_op
// implementation 'com.blankj:utilcode:1.22.0'
// implementation 'com.blankj:utilcode:1.22.1'
}
\ No newline at end of file
......@@ -2,7 +2,9 @@ package com.blankj.androidutilcode.feature.core;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.provider.Settings;
import android.support.annotation.Nullable;
import android.view.View;
......@@ -84,7 +86,6 @@ public class CoreUtilActivity extends BaseBackActivity {
public void adaptScreenClick(View view) {
BusUtils.post("AdaptScreenActivity#start", this);
// AdaptScreenActivity.start(this);
}
public void appClick(View view) {
......@@ -174,4 +175,14 @@ public class CoreUtilActivity extends BaseBackActivity {
public void toastClick(View view) {
ToastActivity.start(this);
}
public static float getAnimationScale(Context context) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
return Settings.Global.getFloat(context.getContentResolver(),
Settings.Global.ANIMATOR_DURATION_SCALE, 1.0f);
} else {
return Settings.System.getFloat(context.getContentResolver(),
Settings.System.ANIMATOR_DURATION_SCALE, 1.0f);
}
}
}
......@@ -28,10 +28,7 @@ class AdaptScreenActivity : BaseBackActivity() {
override fun initView(savedInstanceState: Bundle?, contentView: View?) {
adaptWidthBtn.setOnClickListener { WidthActivity.start(this) }
adaptHeightBtn.setOnClickListener { HeightActivity.start(this) }
closeAdaptBtn.setOnClickListener {
BusUtils.post<Any>("CloseAdaptActivity#start", this)
// CloseAdaptActivity.start(this)
}
closeAdaptBtn.setOnClickListener { CloseAdaptActivity.start(this) }
}
override fun doBusiness() {}
......
......@@ -8,13 +8,10 @@ import android.support.v7.app.AppCompatActivity
import android.view.WindowManager
import com.blankj.androidutilcode.R
import com.blankj.utilcode.util.AdaptScreenUtils
import com.blankj.utilcode.util.BusUtils
class CloseAdaptActivity : AppCompatActivity() {
companion object Instance {
@JvmStatic
@BusUtils.Subscribe(name = "CloseAdaptActivity#start")
companion object {
fun start(context: Context) {
val starter = Intent(context, CloseAdaptActivity::class.java)
context.startActivity(starter)
......
# Change Log
## v1.5
升级 javassist 来修复 Kotlin 匿名类 NotFoundException
## v1.4
优化 inject 兼容 Kotlin 的 bus
## v1.3
去除 static bus,只注入 utilcode
## v1.2
修复 bug
## v1.1
升级 javassist 版本,兼容 Java8
## v1.0
发布初版本
\ No newline at end of file
......@@ -4,27 +4,34 @@ import com.blankj.util.JavassistUtils
import com.blankj.util.ZipUtils
import javassist.CtClass
import javassist.CtMethod
import javassist.NotFoundException
import org.apache.commons.io.FileUtils
class BusInject {
static void start(HashMap<String, String> bus, File busJar) {
String jarPath = busJar.getAbsolutePath()
String decompressedJarPath = jarPath.substring(0, jarPath.length() - 4);
File decompressedJar = new File(decompressedJarPath)
ZipUtils.unzipFile(busJar, decompressedJar)
String jarPath = busJar.getAbsolutePath()
String decompressedJarPath = jarPath.substring(0, jarPath.length() - 4);
File decompressedJar = new File(decompressedJarPath)
ZipUtils.unzipFile(busJar, decompressedJar)
CtClass busUtils = JavassistUtils.getPool().get(Config.CLASS_BUS_UTILS)
CtMethod callMethod = busUtils.getDeclaredMethod("post");
callMethod.insertAfter(getInsertContent(bus));
busUtils.writeFile(decompressedJarPath)
busUtils.defrost();
FileUtils.forceDelete(busJar)
ZipUtils.zipFile(decompressedJar, busJar)
FileUtils.forceDelete(decompressedJar)
CtClass busUtils = JavassistUtils.getPool().get(Config.BUS_UTILS_CLASS)
CtMethod callMethod;
try {
callMethod = busUtils.getDeclaredMethod("injectShell");
callMethod.insertAfter(getInsertContent(bus, false));
} catch (NotFoundException ignore) {
callMethod = busUtils.getDeclaredMethod("post");
callMethod.insertAfter(getInsertContent(bus, true));
}
busUtils.writeFile(decompressedJarPath)
busUtils.defrost();
FileUtils.forceDelete(busJar)
ZipUtils.zipFile(decompressedJar, busJar)
FileUtils.forceDelete(decompressedJar)
}
private static String getInsertContent(HashMap<String, String> bus) {
private static String getInsertContent(HashMap<String, String> bus, boolean isLow) {
StringBuilder sb = new StringBuilder();
bus.each { String key, String val ->
String name = key
......@@ -72,7 +79,9 @@ class BusInject {
}
sb.append("}")
}
sb.append('android.util.Log.e("BusUtils", "bus of <" + $1 + "> didn\'t exist.");')
if (isLow) {
sb.append('android.util.Log.e("BusUtils", "bus of <" + $1 + "> didn\'t exist.");')
}
return sb.toString()
}
}
\ No newline at end of file
......@@ -6,7 +6,9 @@ import com.blankj.util.ZipUtils
import com.blankj.utilcode.util.BusUtils
import groovy.io.FileType
import javassist.CtClass
import javassist.CtField
import javassist.CtMethod
import javassist.NotFoundException
import org.apache.commons.io.FileUtils
import java.lang.reflect.Modifier
......@@ -54,20 +56,58 @@ class BusScan {
className = className.substring(0, className.length() - 6)
CtClass ctClass = JavassistUtils.getPool().get(className)
CtMethod[] methods = ctClass.getDeclaredMethods();
CtMethod[] methods = ctClass.getMethods();
for (CtMethod method : methods) {
if (method.hasAnnotation(BusUtils.Subscribe)) {
if (method.hasAnnotation(BusUtils.Subscribe.class)) {
String name = ((BusUtils.Subscribe) method.getAnnotation(BusUtils.Subscribe.class)).name();
if (busMap.containsKey(name)) {
LogUtils.l("bus of " + name + " has registered: " + method.getLongName());
continue;
}
String methodLongName = method.getLongName();
if (Modifier.isStatic(method.getModifiers())) {
String name = method.getAnnotation(BusUtils.Subscribe).name()
String sign = method.getReturnType().getName() + ' ' + method.getLongName()
busMap.put(name, sign)
} else {
LogUtils.l(method.getLongName() + "is not static")
String sign = method.getReturnType().getName() + ' ' + methodLongName;
busMap.put(name, sign);
} else {// may be is kotlin
processKt(method, name, methodLongName)
}
}
}
}
}
}
private void processKt(CtMethod method, String name, String longMethodName) {
CtClass ktClass = method.getDeclaringClass();
try {
CtField instance = ktClass.getField("INSTANCE");
LogUtils.l("find INSTANCE: " + name + ": " + longMethodName);
int i = longMethodName.lastIndexOf('(');
String temp = longMethodName.substring(0, i);
int j = temp.lastIndexOf('.');
String sign = method.getReturnType().getName() + ' ' +
longMethodName.substring(0, j) +
".INSTANCE" +
longMethodName.substring(j);
busMap.put(name, sign);
} catch (NotFoundException ignore) {
String innerClassSimpleName = ktClass.getSimpleName();
if (innerClassSimpleName.contains('$') && !innerClassSimpleName.endsWith('$')) {
String innerClassName = ktClass.getName();
String outerClassName = innerClassName.substring(0, innerClassName.lastIndexOf('$'));
CtClass outerClass = JavassistUtils.getPool().get(outerClassName);
try {
CtField ctField = outerClass.getField(innerClassSimpleName.substring(innerClassSimpleName.lastIndexOf('$') + 1));
String fieldName = ctField.getName();
String methodName = longMethodName.replace('$' + fieldName, '.' + fieldName);
String sign = method.getReturnType().getName() + ' ' + methodName;
busMap.put(name, sign);
} catch (NotFoundException ignored) {
LogUtils.l(longMethodName + "is not static");
}
} else {
LogUtils.l(longMethodName + "is not static");
}
}
}
}
......@@ -13,5 +13,5 @@ class Config {
public static final String FILE_SEP = System.getProperty("file.separator")
public static final String CLASS_BUS_UTILS = 'com.blankj.utilcode.util.BusUtils'
public static final String BUS_UTILS_CLASS = 'com.blankj.utilcode.util.BusUtils'
}
......@@ -19,6 +19,7 @@ class JavassistUtils {
sPool = new ClassPool(null)
sPool.appendSystemPath()
// 加入本地 android 包
LogUtils.l(project.android.bootClasspath[0].toString())
sPool.appendClassPath(project.android.bootClasspath[0].toString())
}
......
package com.blankj.bus;
import com.blankj.util.JsonUtils;
import com.blankj.utilcode.util.BusUtils;
import org.apache.commons.io.FileUtils;
......@@ -8,10 +9,16 @@ import org.junit.Test;
import java.io.File;
import java.util.Collection;
import java.util.HashMap;
import java.util.function.BiConsumer;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtField;
import javassist.CtMethod;
import javassist.CtNewMethod;
import javassist.Modifier;
import javassist.NotFoundException;
/**
* <pre>
......@@ -27,9 +34,11 @@ public class BusTest {
public void test() throws Exception {
String rootPath = "/Users/blankj/Repo/AndroidUtilCode/app/build/intermediates/transforms/busTransform/debug/43/";
File root = new File(rootPath);
ClassPool mPool = new ClassPool(null);
ClassPool mPool = new ClassPool(null);
mPool.appendSystemPath();
mPool.appendClassPath(rootPath);
mPool.appendClassPath("/Users/blankj/Library/Android/sdk/platforms/android-27/android.jar");
HashMap<String, String> busMap = new HashMap<>();
if (root.isDirectory()) {
Collection<File> files = FileUtils.listFiles(root, new String[]{"class"}, true);
......@@ -48,11 +57,125 @@ public class BusTest {
for (CtMethod method : methods) {
if (method.hasAnnotation(BusUtils.Subscribe.class)) {
String name = ((BusUtils.Subscribe) method.getAnnotation(BusUtils.Subscribe.class)).name();
String sign = method.getReturnType().getName() + ' ' + method.getLongName();
System.out.println(name + ": " + sign);
if (busMap.containsKey(name)) {
System.out.println("bus of " + name + " has registered." + method.getLongName());
continue;
}
String longMethodName = method.getLongName();
if (Modifier.isStatic(method.getModifiers())) {
String sign = method.getReturnType().getName() + ' ' + longMethodName;
busMap.put(name, sign);
} else {// may be is kotlin
processKt(mPool, busMap, method, name, longMethodName);
}
}
}
}
System.out.println(JsonUtils.getFormatJson(busMap));
}
CtClass ctClass = mPool.makeClass("com.blankj.bus.BusUtils");
String src = "" +
"public static Object post(String name, Object[] objects) {\n" +
" if (name == null || name.length() == 0) return null;\n" +
" return null;\n" +
"}";
CtMethod make = CtNewMethod.make(src, ctClass);
ctClass.addMethod(make);
make.insertAfter(getInsertContent(busMap));
ctClass.debugWriteFile();
}
private void processKt(ClassPool mPool,
HashMap<String, String> busMap,
CtMethod method, String name,
String longMethodName) throws NotFoundException {
CtClass innerClass = method.getDeclaringClass();
try {
CtField instance = innerClass.getField("INSTANCE");
System.out.println("find INSTANCE: " + name + ": " + longMethodName);
int i = longMethodName.lastIndexOf('(');
String temp = longMethodName.substring(0, i);
int j = temp.lastIndexOf('.');
String sign = method.getReturnType().getName() + ' '
+ longMethodName.substring(0, j)
+ ".INSTANCE"
+ longMethodName.substring(j);
System.out.println(sign);
busMap.put(name, sign);
} catch (NotFoundException ignore) {
String innerClassSimpleName = innerClass.getSimpleName();
if (innerClassSimpleName.contains("$") && !innerClassSimpleName.endsWith("$")) {
String innerClassName = innerClass.getName();
String outerClassName = innerClassName.substring(0, innerClassName.lastIndexOf('$'));
CtClass outerClass = mPool.get(outerClassName);
try {
CtField ctField = outerClass.getField(innerClassSimpleName.substring(innerClassSimpleName.lastIndexOf('$') + 1));
String fieldName = ctField.getName();
String methodName = longMethodName.replace("$" + fieldName, "." + fieldName);
String sign = method.getReturnType().getName() + ' ' + methodName;
busMap.put(name, sign);
} catch (NotFoundException e) {
System.out.println(longMethodName + "is not static");
}
} else {
System.out.println(longMethodName + "is not static");
}
}
}
private static String getInsertContent(HashMap<String, String> bus) {
final StringBuilder sb = new StringBuilder();
bus.forEach(new BiConsumer<String, String>() {
@Override
public void accept(String name, String sign) {
String[] method = sign.split(" ");
String returnType = method[0];
String methodName = method[1];
sb.append("if (\"").append(name).append("\".equals($1)) {\n");
int st = methodName.indexOf('(');
int end = methodName.length();
String params = methodName.substring(st + 1, end - 1);
if (!params.equals("")) {
String[] paramArr = params.split(",");
StringBuilder args = new StringBuilder();
for (int i = 0; i < paramArr.length; i++) {
if (paramArr[i].equals("char")) {
args.append(",$2[").append(i).append("].toString().charAt(0)");
} else if (paramArr[i].equals("boolean")) {
args.append(",Boolean.parseBoolean($2[").append(i).append("].toString())");
} else if (paramArr[i].equals("byte")) {
args.append(",Byte.parseByte($2[").append(i).append("].toString())");
} else if (paramArr[i].equals("short")) {
args.append(",Short.parseShort($2[").append(i).append("].toString())");
} else if (paramArr[i].equals("int")) {
args.append(",Integer.parseInt($2[").append(i).append("].toString())");
} else if (paramArr[i].equals("long")) {
args.append(",Long.parseLong($2[").append(i).append("].toString())");
} else if (paramArr[i].equals("float")) {
args.append(",Float.parseFloat($2[").append(i).append("].toString())");
} else if (paramArr[i].equals("double")) {
args.append(",Double.parseDouble($2[").append(i).append("].toString())");
} else {
args.append(",(").append(paramArr[i]).append(")$2[").append(i).append("]");
}
}
methodName = methodName.substring(0, st + 1) + args.substring(1) + ")";
}
if (returnType.equals("void")) {
sb.append(methodName).append(";\n").append("return null;\n");
} else {
sb.append("return ($w)").append(methodName).append(";\n");
}
sb.append("}");
}
});
return sb.toString();
}
}
......@@ -5,12 +5,12 @@ ext {
compileSdkVersion = 27
minSdkVersion = 14
targetSdkVersion = 27
versionCode = 1_022_000
versionName = '1.22.0'// E.g. 1.9.72 => 1,009,072
versionCode = 1_022_001
versionName = '1.22.1'// E.g. 1.9.72 => 1,009,072
bus = [
isDebug: true,
version: '1.3',
isDebug: false,
version: '1.5',
group : 'com.blankj'
]
......@@ -46,7 +46,7 @@ ext {
gson : "com.google.code.gson:gson:2.8.2",
glide : "com.github.bumptech.glide:glide:4.7.1",
retrofit : "com.squareup.retrofit2:retrofit:2.4.0",
javassist : "org.javassist:javassist:3.23.1-GA",
javassist : "org.javassist:javassist:3.24.0-GA",
commons_io : "commons-io:commons-io:2.5",
junit : "junit:junit:4.12",
......
......@@ -43,13 +43,13 @@ class MainActivity : BaseDrawerActivity() {
BarUtils.setStatusBarAlpha4Drawer(this, mDrawerRootLayout, launcherMainFakeStatusBar, 0, false)
BarUtils.addMarginTopEqualStatusBarHeight(launcherMainToolbar)
// launcherMainCoreUtilBtn.setOnClickListener {
// BusUtils.post<Any>("CoreUtilActivity#start", this)
// }
//
// launcherMainSubUtilBtn.setOnClickListener {
// BusUtils.post<Any>("SubUtilActivity#start", this)
// }
launcherMainCoreUtilBtn.setOnClickListener {
BusUtils.post<Any>("CoreUtilActivity#start", this)
}
launcherMainSubUtilBtn.setOnClickListener {
BusUtils.post<Any>("SubUtilActivity#start", this)
}
}
override fun doBusiness() {
......@@ -60,14 +60,6 @@ class MainActivity : BaseDrawerActivity() {
}
fun coreUtilClick(view: View) {
}
fun subUtilClick(view: View) {
BusUtils.post<Any>("SubUtilActivity#start", this)
}
override fun onBackPressed() {
ActivityUtils.startHomeActivity()
}
......
......@@ -55,15 +55,15 @@
android:paddingRight="@dimen/spacing_16">
<Button
style="@style/WideBtnStyle"
android:id="@+id/launcherMainCoreUtilBtn"
style="@style/WideBtnStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/core_util" />
<Button
style="@style/WideBtnStyle"
android:id="@+id/launcherMainSubUtilBtn"
style="@style/WideBtnStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/sub_util" />
......
......@@ -85,26 +85,26 @@ getSurnameFirstLetter
[brightness.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/subutil/subutil-lib/src/main/java/com/blankj/subutil/util/BrightnessUtils.java
[brightness.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/subutil/lib/src/main/java/com/blankj/subutil/util/BrightnessUtils.java
[brightness.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/feature/sub/brightness/BrightnessActivity.java
[clipboard.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/subutil/subutil-lib/src/main/java/com/blankj/subutil/util/ClipboardUtils.java
[clipboard.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/subutil/subutil-lib/src/test/java/com/blankj/subutil/util/ClipboardUtilsTest.java
[clipboard.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/subutil/lib/src/main/java/com/blankj/subutil/util/ClipboardUtils.java
[clipboard.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/subutil/lib/src/test/java/com/blankj/subutil/util/ClipboardUtilsTest.java
[clone.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/subutil/subutil-lib/src/main/java/com/blankj/subutil/util/CloneUtils.java
[clone.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/subutil/subutil-lib/src/test/java/com/blankj/subutil/util/CloneUtilsTest.java
[clone.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/subutil/lib/src/main/java/com/blankj/subutil/util/CloneUtils.java
[clone.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/subutil/lib/src/test/java/com/blankj/subutil/util/CloneUtilsTest.java
[coordinate.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/subutil/subutil-lib/src/main/java/com/blankj/subutil/util/CoordinateUtils.java
[coordinate.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/subutil/subutil-lib/src/test/java/com/blankj/subutil/util/CoordinateUtilsTest.java
[coordinate.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/subutil/lib/src/main/java/com/blankj/subutil/util/CoordinateUtils.java
[coordinate.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/subutil/lib/src/test/java/com/blankj/subutil/util/CoordinateUtilsTest.java
[flashlight.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/subutil/subutil-lib/src/main/java/com/blankj/subutil/util/FlashlightUtils.java
[flashlight.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/subutil/lib/src/main/java/com/blankj/subutil/util/FlashlightUtils.java
[flashlight.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/feature/sub/flashlight/FlashlightActivity.java
[gson.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/subutil/subutil-lib/src/main/java/com/blankj/subutil/util/GsonUtils.java
[gson.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/subutil/subutil-lib/src/test/java/com/blankj/subutil/util/GsonUtilsTest.java
[gson.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/subutil/lib/src/main/java/com/blankj/subutil/util/GsonUtils.java
[gson.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/subutil/lib/src/test/java/com/blankj/subutil/util/GsonUtilsTest.java
[location.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/subutil/subutil-lib/src/main/java/com/blankj/subutil/util/LocationUtils.java
[location.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/subutil/lib/src/main/java/com/blankj/subutil/util/LocationUtils.java
[location.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/feature/sub/location/LocationActivity.java
[pinyin.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/subutil/subutil-lib/src/main/java/com/blankj/subutil/util/PinyinUtils.java
[pinyin.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/subutil/lib/src/main/java/com/blankj/subutil/util/PinyinUtils.java
[pinyin.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/feature/sub/pinyin/PinyinActivity.java
......@@ -2,7 +2,7 @@
Gradle:
```groovy
implementation 'com.blankj:utilcode:1.22.0'
implementation 'com.blankj:utilcode:1.22.1'
```
......@@ -88,6 +88,12 @@ getNavBarColor : 获取导航栏颜色
isSupportNavBar : 判断是否支持导航栏
```
* ### Bus 相关 -> [BusUtils.java][bus.java] -> [README][bus.readme]
```
post: 发送
```
* ### 磁盘缓存相关 -> [CacheDiskUtils.java][cacheDisk.java] -> [Test][cacheDisk.test]
```
getInstance : 获取缓存实例
......@@ -816,6 +822,9 @@ getComments : 获取压缩文件中的注释链表
[bar.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/lib/src/main/java/com/blankj/utilcode/util/BarUtils.java
[bar.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/feature/core/bar/BarActivity.java
[bus.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/lib/src/main/java/com/blankj/utilcode/util/BusUtils.java
[bus.readme]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/README-STATIC-BUS.md
[cacheDisk.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheDiskUtils.java
[cacheDisk.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/lib/src/test/java/com/blankj/utilcode/util/CacheDiskUtilsTest.java
......
......@@ -2,7 +2,7 @@
## 关于
组件化开发会涉及到模块与模块之间相互调用,而各模块之间又是解偶的,所以就产生了很多路由方案,或者是把接口下沉到 `base` 组件中,但在 **[StaticBus][bus]** 看来,它们都略显复杂,**[StaticBus][bus]** 只需调用一个静态函数便可自由穿梭于各个模块,就像一辆巴士,由于是基于静态函数来实现,所以称她为 **[StaticBus][bus]**
组件化开发会涉及到模块与模块之间相互调用,而各模块之间又是解偶的,所以就产生了很多路由方案,或者是把接口下沉到 `base` 组件中,但在 **[StaticBus][bus]** 看来,它们都略显复杂,**[StaticBus][bus]** 只需调用一个静态函数便可自由穿梭于各个模块,就像一辆巴士,由于是基于静态函数来实现,所以称她为 **[StaticBus][bus]**,如今已支持 Kotlin
## 基本使用
......@@ -13,7 +13,7 @@
buildscript {
dependencies {
...
classpath 'com.blankj:bus-gradle-plugin:1.3'
classpath 'com.blankj:bus-gradle-plugin:1.5'
}
}
```
......@@ -27,7 +27,7 @@ apply plugin: "com.blankj.bus"
给 base 模块添加 [AndroidUtilCode](https://github.com/Blankj/AndroidUtilCode) 依赖:
```groovy
api "com.blankj:utilcode:1.22.0"
api "com.blankj:utilcode:1.22.1"
```
比如 module0 中存在的 `Module0Activity.java`,我们通常都是在它内部写一个 `start` 函数来启动它,现在我们给它添加 `@BusUtils.Subscribe` 注解,并给注解的 `name` 赋唯一值,要注意,函数务必要 `public static` 哦:
......@@ -63,6 +63,8 @@ boolean result = BusUtils.post("startModule0", context, "blankj", 18);
## 高级使用
参看本项目的组件化即可。
......
此差异已折叠。
package com.blankj.utilcode.util;
import android.util.Log;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
......@@ -18,9 +20,20 @@ import java.lang.annotation.Target;
*/
public final class BusUtils {
private static final Object NULL = new Object();
public static <T> T post(String name, Object... objects) {
if (name == null || name.length() == 0) return null;
return null;
Object o = injectShell(name, objects);
if (NULL.equals(o)) {
Log.e("BusUtils", "bus of <" + name + "> didn\'t exist.");
return null;
}
return (T) o;
}
private static Object injectShell(String name, Object[] objects) {
return NULL;
}
@Target({ElementType.METHOD})
......
package com.blankj.utilcode.util;
import android.support.annotation.Nullable;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
import java.util.concurrent.TimeUnit;
/**
* <pre>
* author: Blankj
......@@ -28,24 +24,6 @@ public class BaseTest {
@Test
public void test() {
ThreadUtils.SimpleTask<String> task = new ThreadUtils.SimpleTask<String>() {
@Nullable
@Override
public String doInBackground() throws Throwable {
boolean fl = true;
while (fl) {
System.out.println("haha");
}
return null;
}
@Override
public void onSuccess(@Nullable String result) {
}
};
ThreadUtils.executeByCpuWithDelay(task, 20, TimeUnit.SECONDS);
// task.cancel();
// ThreadUtils.cancel(task);
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册