Ver código fonte

加入动态代理,但是在8.0不能debug

詹子聪 5 anos atrás
pai
commit
6f3672aafb

+ 9 - 5
app/build.gradle

@@ -1,5 +1,5 @@
 apply plugin: 'com.android.application'
-apply plugin: 'com.hujiang.android-aspectjx'
+//apply plugin: 'com.hujiang.android-aspectjx'
 
 
 android {
@@ -19,6 +19,10 @@ android {
             proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
         }
     }
+    compileOptions {
+        sourceCompatibility JavaVersion.VERSION_1_8
+        targetCompatibility JavaVersion.VERSION_1_8
+    }
 }
 
 dependencies {
@@ -31,9 +35,9 @@ dependencies {
     implementation project(path: ':common')
     implementation project(path: ':mvp')
 
-    compile 'org.aspectj:aspectjrt:1.8.+'
+//    compile 'org.aspectj:aspectjrt:1.8.+'
 }
 
-aspectjx {
-    exclude  "android.support",'androidx','com.google','com.squareup.leakcanary','com.squareup.leakcanary.core','com.alipay','org.apache','com.tencent'
-}
+//aspectjx {
+//    exclude  "android.support",'androidx','com.google','com.squareup.leakcanary','com.squareup.leakcanary.core','com.alipay','org.apache','com.tencent'
+//}

+ 1 - 1
app/src/main/java/com/miekir/newmvp/MainActivity.java

@@ -15,7 +15,7 @@ public class MainActivity extends BaseMvpActivity implements View.OnClickListene
     MainPresenter presenter;
 
     @Override
-    public int getLayoutID() {
+    public int getLayoutId() {
         return R.layout.activity_main;
     }
 

+ 23 - 1
app/src/main/java/com/miekir/newmvp/MainPresenter.java

@@ -1,7 +1,13 @@
 package com.miekir.newmvp;
 
+import com.miekir.common.utils.LogTool;
 import com.miekir.mvp.presenter.BasePresenter;
 
+import io.reactivex.Observable;
+import io.reactivex.ObservableOnSubscribe;
+import io.reactivex.android.schedulers.AndroidSchedulers;
+import io.reactivex.schedulers.Schedulers;
+
 /**
  * Copyright (C), 2019-2020, Miekir
  *
@@ -16,6 +22,22 @@ public class MainPresenter extends BasePresenter<IMainView> {
     }
 
     public void doWork() {
-        getView().onMainResult();
+        Observable.create((ObservableOnSubscribe<String>) emitter -> {
+            try {
+                Thread.sleep(5000);
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+            emitter.onNext("");
+            emitter.onComplete();
+        })
+        .subscribeOn(Schedulers.io())
+        .observeOn(AndroidSchedulers.mainThread())
+        .subscribe(next -> {
+            LogTool.d("MainPresenter", "onNext thread is: " + Thread.currentThread().getName());
+            getCallbackView().onMainResult();
+        }, error -> {
+            LogTool.d(getClass().getName(), error.getMessage());
+        });
     }
 }

+ 1 - 1
build.gradle

@@ -8,7 +8,7 @@ buildscript {
     }
     dependencies {
         classpath 'com.android.tools.build:gradle:3.6.1'
-        classpath 'com.hujiang.aspectjx:gradle-android-plugin-aspectjx:2.0.10'
+//        classpath 'com.hujiang.aspectjx:gradle-android-plugin-aspectjx:2.0.10'
     }
 }
 

+ 3 - 0
common/build.gradle

@@ -67,4 +67,7 @@ dependencies {
 
     // 适配器
     //api 'com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.50'
+
+    // 动态代理
+    //api group: 'cglib', name: 'cglib', version: '3.3.0'
 }

+ 2 - 2
mvp/src/main/java/com/miekir/mvp/base/BaseActivity.java

@@ -31,7 +31,7 @@ public abstract class BaseActivity extends AppCompatActivity {
         //Log.d(getClass().getName(), "obj is : "  + this.toString());
 
         super.onCreate(savedInstanceState);
-        rootView = LayoutInflater.from(this).inflate(getLayoutID(), null);
+        rootView = LayoutInflater.from(this).inflate(getLayoutId(), null);
         setContentView(rootView);
 
         View.OnTouchListener rootTouchListener = new View.OnTouchListener() {
@@ -90,7 +90,7 @@ public abstract class BaseActivity extends AppCompatActivity {
         getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
     }
 
-    public abstract int getLayoutID();
+    public abstract int getLayoutId();
 
     public abstract void initViews(Bundle savedInstanceState);
 

+ 19 - 7
mvp/src/main/java/com/miekir/mvp/presenter/BasePresenter.java

@@ -4,8 +4,10 @@ import androidx.lifecycle.ViewModel;
 
 import com.miekir.common.utils.LogTool;
 import com.miekir.mvp.view.IView;
+import com.miekir.mvp.view.ViewHandler;
 
 import java.lang.ref.WeakReference;
+import java.lang.reflect.Proxy;
 
 /**
  * Copyright (C), 2019-2020, Miekir
@@ -19,14 +21,24 @@ import java.lang.ref.WeakReference;
 
  */
 public abstract class BasePresenter<V extends IView> extends ViewModel {
-    private WeakReference<V> wrf;
+    private WeakReference<V> mViewReference;
 
-    public V getView() {
-        return wrf == null ? null : wrf.get();
+    private ViewHandler mViewHandler;
+    public V getCallbackView() {
+        mViewHandler.setView(getView());
+        return  (V) Proxy.newProxyInstance(
+                Thread.currentThread().getContextClassLoader(),
+                mViewHandler.getClazz().getInterfaces(),
+                mViewHandler);
+    }
+
+    private V getView() {
+        return mViewReference == null ? null : mViewReference.get();
     }
 
     public void attachView(V view) {
-        wrf = new WeakReference<V>(view);
+        mViewHandler = new ViewHandler(view.getClass());
+        mViewReference = new WeakReference<V>(view);
     }
 
     @Override
@@ -41,9 +53,9 @@ public abstract class BasePresenter<V extends IView> extends ViewModel {
      */
     public void detachView() {
         onTaskCancel();
-        if (wrf != null) {
-            wrf.clear();
-            wrf = null;
+        if (mViewReference != null) {
+            mViewReference.clear();
+            mViewReference = null;
         }
     }
 

+ 37 - 0
mvp/src/main/java/com/miekir/mvp/view/ViewHandler.java

@@ -0,0 +1,37 @@
+package com.miekir.mvp.view;
+
+import com.miekir.common.utils.LogTool;
+
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
+
+public class ViewHandler implements InvocationHandler {
+    private Object mView;
+    private Class mClazz;
+
+    public ViewHandler(Class clazz) {
+        mClazz = clazz;
+    }
+
+    public Class getClazz() {
+        return mClazz;
+    }
+
+    public void setView(Object view) {
+        mView = view;
+    }
+
+    @Override
+    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
+        Object invoke = null;
+
+        if (mView != null) {
+            LogTool.d("proxy_handler", "invoke!!!!");
+            invoke = method.invoke(mView, args);
+        } else {
+            LogTool.d("proxy_handler", "null!!!!");
+        }
+
+        return invoke;
+    }
+}