Skip to content

Commit 6cb3084

Browse files
committed
添加拦截器与降级功能
1 parent afa0403 commit 6cb3084

File tree

77 files changed

+1396
-61
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

77 files changed

+1396
-61
lines changed

app/build.gradle

+5-2
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,11 @@ android {
3232
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
3333
}
3434
}
35-
sourceCompatibility = "1.8"
36-
targetCompatibility = "1.8"
35+
36+
compileOptions {
37+
sourceCompatibility JavaVersion.VERSION_1_8
38+
targetCompatibility JavaVersion.VERSION_1_8
39+
}
3740

3841
}
3942

app/src/androidTest/java/com/aprz/brouter/ExampleInstrumentedTest.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,13 @@
22

33
import android.content.Context;
44

5-
import androidx.test.platform.app.InstrumentationRegistry;
65
import androidx.test.ext.junit.runners.AndroidJUnit4;
6+
import androidx.test.platform.app.InstrumentationRegistry;
77

88
import org.junit.Test;
99
import org.junit.runner.RunWith;
1010

11-
import static org.junit.Assert.*;
11+
import static org.junit.Assert.assertEquals;
1212

1313
/**
1414
* Instrumented test, which will execute on an Android device.

app/src/main/AndroidManifest.xml

+1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
<category android:name="android.intent.category.LAUNCHER" />
1818
</intent-filter>
1919
</activity>
20+
<activity android:name=".NotFoundActivity" />
2021
</application>
2122

2223
</manifest>

app/src/main/java/com/aprz/brouter/App.java

+3
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import android.content.Context;
55

66
import com.aprz.brouter.api.core.BRouter;
7+
import com.aprz.brouter.api.module.ModuleHelper;
78
import com.aprz.component_impl.Component;
89
import com.aprz.component_impl.Config;
910

@@ -13,6 +14,8 @@ public class App extends Application {
1314
public void onCreate() {
1415
super.onCreate();
1516
BRouter.init(this, false);
17+
ModuleHelper.register("app");
18+
ModuleHelper.register("wallet");
1619

1720
Component.init(
1821
BuildConfig.DEBUG,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package com.aprz.brouter;
2+
3+
import android.app.Application;
4+
5+
import com.aprz.brouter.annotation.Module;
6+
import com.aprz.brouter.api.module.IModule;
7+
8+
@Module
9+
public class AppModule implements IModule {
10+
11+
@Override
12+
public void onCreate(Application application) {
13+
14+
}
15+
16+
@Override
17+
public void onDestroy() {
18+
19+
}
20+
}

app/src/main/java/com/aprz/brouter/MainActivity.java

+8-3
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
package com.aprz.brouter;
22

3-
import androidx.appcompat.app.AppCompatActivity;
4-
import androidx.fragment.app.Fragment;
5-
63
import android.os.Bundle;
74
import android.view.View;
85
import android.widget.FrameLayout;
96
import android.widget.Toast;
107

8+
import androidx.appcompat.app.AppCompatActivity;
9+
import androidx.fragment.app.Fragment;
10+
1111
import com.aprz.brouter.api.core.BRouter;
1212
import com.aprz.component_impl.ComponentManager;
1313
import com.aprz.component_impl.fragment.FragmentCenter;
@@ -28,6 +28,7 @@ public void onClick(View v) {
2828
Bundle bundle = new Bundle();
2929
bundle.putInt("count", 30);
3030
bundle.putString("message", "hello");
31+
bundle.putLong("userId", 9527);
3132
BRouter.getInstance().path("wallet/main").params(bundle).navigate();
3233
}
3334
});
@@ -66,5 +67,9 @@ public void onClick(View v) {
6667
}
6768
}
6869
});
70+
71+
findViewById(R.id.btn_test_interceptors).setOnClickListener((v) -> {
72+
BRouter.getInstance().path("xxx/404").navigate(this);
73+
});
6974
}
7075
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.aprz.brouter;
2+
3+
import android.os.Bundle;
4+
5+
import androidx.annotation.Nullable;
6+
import androidx.appcompat.app.AppCompatActivity;
7+
8+
import com.aprz.brouter.annotation.Route;
9+
10+
@Route(path = "app/not_found")
11+
public class NotFoundActivity extends AppCompatActivity {
12+
13+
@Override
14+
protected void onCreate(@Nullable Bundle savedInstanceState) {
15+
super.onCreate(savedInstanceState);
16+
setContentView(R.layout.activity_not_found);
17+
}
18+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package com.aprz.brouter.interceptos;
2+
3+
import android.content.Intent;
4+
import android.util.Log;
5+
6+
import androidx.annotation.NonNull;
7+
8+
import com.aprz.brouter.annotation.Interceptor;
9+
import com.aprz.brouter.api.core.BRouter;
10+
import com.aprz.brouter.api.core.Navigation;
11+
import com.aprz.brouter.api.degrade.DegradeHelper;
12+
import com.aprz.brouter.api.degrade.IRouteDegrade;
13+
import com.aprz.brouter.api.ex.RouteNotFoundException;
14+
import com.aprz.brouter.api.interceptor.IRouteInterceptor;
15+
16+
/**
17+
* 本来想将这个拦截器写在库里面的,但是发现怎么写都不爽,后来才想明白,这个拦截器应该给使用者实现才是对的
18+
* 当没有匹配的 url 的时候,跳转到一个 404 页面
19+
*/
20+
@Interceptor
21+
public class NotFoundInterceptor implements IRouteInterceptor {
22+
23+
private static final String TAG = "NotFoundInterceptor";
24+
25+
@Override
26+
public int priority() {
27+
return 10;
28+
}
29+
30+
@Override
31+
public void intercept(@NonNull Chain chain, @NonNull Callback callback) {
32+
Log.e(TAG, "NotFoundInterceptor run on " + Thread.currentThread().getName());
33+
Navigation navigate = chain.navigate();
34+
if (navigate.invalid()) {
35+
chain.interrupt(new RouteNotFoundException("没有找到匹配的路由地址:" + navigate.getPath()));
36+
// 有降级策略,走降级
37+
IRouteDegrade routeDegrade = DegradeHelper.getRouteDegrade(navigate);
38+
if (routeDegrade != null) {
39+
routeDegrade.handleDegrade(navigate);
40+
}
41+
// 没有降级策略,走默认页面
42+
else {
43+
// 不要搞成死循环了
44+
BRouter.getInstance().path("app/not_found").navigate();
45+
}
46+
} else {
47+
// 有降级策略,走降级
48+
IRouteDegrade routeDegrade = DegradeHelper.getRouteDegrade(navigate);
49+
if (routeDegrade != null) {
50+
routeDegrade.handleDegrade(navigate);
51+
}
52+
// 没有降级策略,继续执行原来的跳转
53+
else {
54+
chain.proceed(navigate);
55+
}
56+
}
57+
}
58+
}

app/src/main/res/layout/activity_main.xml

+6
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,12 @@
6767
app:layout_constraintLeft_toLeftOf="parent"
6868
app:layout_constraintRight_toRightOf="parent"
6969
app:layout_constraintTop_toBottomOf="@id/unregistLogin" />
70+
71+
<Button
72+
android:id="@+id/btn_test_interceptors"
73+
android:text="拦截器测试"
74+
android:layout_width="wrap_content"
75+
android:layout_height="wrap_content"/>
7076
</com.aprz.brouter.view.XFlowLayout>
7177

7278
<FrameLayout
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
3+
xmlns:app="http://schemas.android.com/apk/res-auto"
4+
android:layout_width="match_parent"
5+
android:layout_height="match_parent">
6+
7+
<TextView
8+
android:layout_width="wrap_content"
9+
android:layout_height="wrap_content"
10+
android:text="功能正在开发中,敬请期待..."
11+
app:layout_constraintBottom_toBottomOf="parent"
12+
app:layout_constraintLeft_toLeftOf="parent"
13+
app:layout_constraintRight_toRightOf="parent"
14+
app:layout_constraintTop_toTopOf="parent" />
15+
16+
</androidx.constraintlayout.widget.ConstraintLayout>

app/src/test/java/com/aprz/brouter/ExampleUnitTest.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import org.junit.Test;
44

5-
import static org.junit.Assert.*;
5+
import static org.junit.Assert.assertEquals;
66

77
/**
88
* Example local unit test, which will execute on the development machine (host).

brouter_annotation/build.gradle

+2-2
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,5 @@ dependencies {
44
implementation fileTree(dir: 'libs', include: ['*.jar'])
55
}
66

7-
sourceCompatibility = "1.7"
8-
targetCompatibility = "1.7"
7+
sourceCompatibility = "1.8"
8+
targetCompatibility = "1.8"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package com.aprz.brouter.annotation;
2+
3+
import java.lang.annotation.ElementType;
4+
import java.lang.annotation.Retention;
5+
import java.lang.annotation.RetentionPolicy;
6+
import java.lang.annotation.Target;
7+
8+
@Target({ElementType.TYPE})
9+
@Retention(RetentionPolicy.SOURCE)
10+
public @interface Degrade {
11+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package com.aprz.brouter.annotation;
2+
3+
import java.lang.annotation.ElementType;
4+
import java.lang.annotation.Retention;
5+
import java.lang.annotation.RetentionPolicy;
6+
import java.lang.annotation.Target;
7+
8+
@Target({ElementType.TYPE})
9+
@Retention(RetentionPolicy.SOURCE)
10+
public @interface Interceptor {
11+
/**
12+
* 该拦截器需要拦截的路径
13+
*/
14+
String path() default "";
15+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package com.aprz.brouter.annotation;
2+
3+
import java.lang.annotation.ElementType;
4+
import java.lang.annotation.Retention;
5+
import java.lang.annotation.RetentionPolicy;
6+
import java.lang.annotation.Target;
7+
8+
@Target({ElementType.TYPE})
9+
@Retention(RetentionPolicy.SOURCE)
10+
public @interface Module {
11+
}

brouter_api/build.gradle

+5
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,11 @@ android {
2020
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
2121
}
2222
}
23+
24+
compileOptions {
25+
sourceCompatibility JavaVersion.VERSION_1_8
26+
targetCompatibility JavaVersion.VERSION_1_8
27+
}
2328
}
2429

2530
dependencies {

brouter_api/src/androidTest/java/com/aprz/brouter/api/ExampleInstrumentedTest.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,13 @@
22

33
import android.content.Context;
44

5-
import androidx.test.platform.app.InstrumentationRegistry;
65
import androidx.test.ext.junit.runners.AndroidJUnit4;
6+
import androidx.test.platform.app.InstrumentationRegistry;
77

88
import org.junit.Test;
99
import org.junit.runner.RunWith;
1010

11-
import static org.junit.Assert.*;
11+
import static org.junit.Assert.assertEquals;
1212

1313
/**
1414
* Instrumented test, which will execute on an Android device.
+1-2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,2 @@
1-
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
2-
package="com.aprz.brouter.api">
1+
<manifest package="com.aprz.brouter.api">
32
</manifest>

brouter_api/src/main/java/com/aprz/brouter/api/IRouteModule.java

-3
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,5 @@
11
package com.aprz.brouter.api;
22

3-
import com.aprz.brouter.api.IRouteMap;
4-
5-
import java.util.List;
63
import java.util.Map;
74

85
public interface IRouteModule {

brouter_api/src/main/java/com/aprz/brouter/api/core/BRouter.java

+8
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,14 @@ public static void init(Application context, boolean registerByPlugin) {
3434
}
3535
}
3636

37+
public static Application application() {
38+
return (Application) sContext;
39+
}
40+
41+
public static Context context() {
42+
return sContext;
43+
}
44+
3745
public Navigation path(String path) {
3846
RouteStore.completion(path);
3947
Navigation navigation = RouteStore.getNavigation(path);

0 commit comments

Comments
 (0)