فهرست منبع

持久化的情况

詹子聪 5 سال پیش
والد
کامیت
99a75639c8

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

@@ -18,6 +18,9 @@ public class MainActivity extends BaseMvpActivity {
     @InjectViewModel
     TestViewModel1 viewModel1;
 
+    @InjectViewModel(isPersist = true)
+    TestViewModel1 viewModel2;
+
     @Override
     public int getLayoutID() {
         return R.layout.activity_main;
@@ -37,7 +40,8 @@ public class MainActivity extends BaseMvpActivity {
         findViewById(R.id.view_test).setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View view) {
-                viewModel1.go();
+                //viewModel1.go();
+                viewModel2.go();
             }
         });
 

+ 6 - 1
mvp/src/main/java/com/miekir/mvp/presenter/InjectViewModel.java

@@ -6,10 +6,15 @@ import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;
 
 /**
- * @description Presenter注入标记
+ *
+ * @author zhan
  * @date 2019/8/19
  */
 @Retention(RetentionPolicy.RUNTIME)
 @Target(ElementType.FIELD)
 public @interface InjectViewModel {
+    /**
+     * @return 运行类型,默认在Activity活动生命周期的时候才触发回调,如果是persist则在后台也能触发回调
+     */
+    boolean isPersist() default false;
 }

+ 9 - 5
mvp/src/main/java/com/miekir/mvp/view/model/BaseMvpActivity.java

@@ -6,7 +6,6 @@ import android.text.TextUtils;
 
 import androidx.lifecycle.MutableLiveData;
 import androidx.lifecycle.Observer;
-import androidx.lifecycle.ViewModelProvider;
 
 import com.miekir.mvp.base.BaseActivity;
 import com.miekir.mvp.base.DataResult;
@@ -55,9 +54,10 @@ public abstract class BaseMvpActivity extends BaseActivity implements IView {
                 field.setAccessible(true);
 
                 // 父类引用指向子类对象
-                //BaseViewModel presenter = type.newInstance();
                 Class<? extends BaseViewModel> type = (Class<? extends BaseViewModel>) field.getType();
-                BaseViewModel presenter = new ViewModelProvider(this).get(type);
+                BaseViewModel presenter = type.newInstance();
+                // 下面这种方法是单例形式,会造成重复回调的问题
+                //BaseViewModel presenter = new ViewModelProvider(this).get(type);
 
                 // 创建一个观察者去更新UI
                 final Observer<DataResult> observer = new Observer<DataResult>() {
@@ -68,11 +68,15 @@ public abstract class BaseMvpActivity extends BaseActivity implements IView {
                         onDataResult(result);
                     }
                 };
-                presenter.getLiveData().observe(this, observer);
+                if (injectViewModel.isPersist()) {
+                    presenter.getLiveData().observeForever(observer);
+                } else {
+                    presenter.getLiveData().observe(this, observer);
+                }
 
                 field.set(this, presenter);
                 mInjectPresenters.add(presenter);
-            } catch (IllegalAccessException e) {
+            } catch (IllegalAccessException | InstantiationException e) {
                 e.printStackTrace();
             } catch (ClassCastException e) {
                 e.printStackTrace();

+ 9 - 5
mvp/src/main/java/com/miekir/mvp/view/model/BaseMvpFragment.java

@@ -8,7 +8,6 @@ import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.lifecycle.MutableLiveData;
 import androidx.lifecycle.Observer;
-import androidx.lifecycle.ViewModelProvider;
 
 import com.miekir.mvp.base.BaseFragment;
 import com.miekir.mvp.base.DataResult;
@@ -69,9 +68,10 @@ public abstract class BaseMvpFragment extends BaseFragment implements IView {
                 field.setAccessible(true);
 
                 // 父类引用指向子类对象
-                //BaseViewModel presenter = type.newInstance();
                 Class<? extends BaseViewModel> type = (Class<? extends BaseViewModel>) field.getType();
-                BaseViewModel presenter = new ViewModelProvider(this).get(type);
+                BaseViewModel presenter = type.newInstance();
+                // 下面这种方法是单例形式,会造成重复回调的问题
+                //BaseViewModel presenter = new ViewModelProvider(this).get(type);
 
                 // 创建一个观察者去更新UI
                 final Observer<DataResult> observer = new Observer<DataResult>() {
@@ -82,11 +82,15 @@ public abstract class BaseMvpFragment extends BaseFragment implements IView {
                         onDataResult(result);
                     }
                 };
-                presenter.getLiveData().observe(this, observer);
+                if (injectViewModel.isPersist()) {
+                    presenter.getLiveData().observeForever(observer);
+                } else {
+                    presenter.getLiveData().observe(this, observer);
+                }
 
                 field.set(this, presenter);
                 mInjectPresenters.add(presenter);
-            } catch (IllegalAccessException e) {
+            } catch (IllegalAccessException | java.lang.InstantiationException e) {
                 e.printStackTrace();
             } catch (ClassCastException e) {
                 e.printStackTrace();