goldze / MVVMHabit

👕基于谷歌最新AAC架构,MVVM设计模式的一套快速开发库,整合Okhttp+RxJava+Retrofit+Glide等主流模块,满足日常开发需求。使用该框架可以快速开发一个高质量、易维护的Android应用。
Apache License 2.0
7.58k stars 1.69k forks source link

Bug问题,统一在此反馈 #29

Closed goldze closed 4 years ago

goldze commented 6 years ago

如果您在使用中发现存在Bug,请在此提出,感谢您的反馈!

yangpan2015 commented 6 years ago

有一个地方应该是有问题的。ViewModel不能持有Activity Fragment等的引用。

archangellcc commented 6 years ago

AppManager内下述方法逻辑错误应该改为 /**

goldze commented 6 years ago

@archangellcc 感谢反馈

goldze commented 6 years ago

@long66xu 请参见文章4.1.3小节

oldfish96 commented 6 years ago

希望添加个不同界面的viewpager例子,还想问不用fragment直接三个不同的viewmodel加上viewpager去能用吗?如果能,该怎么实现?

QingyunDeng commented 5 years ago

感觉这根本不是mvvm,只是使用了一个databinding而已,业务逻辑写得更像之前的mvc了,viewmodule或者livedata根本没用

ViewModel的生成不该用new,有回收风险,用官方提供的ViewModel比较好. livedata和ObservableField 用一个就可以了. 这的确是MMVM啊.

rmtic commented 5 years ago

Messenger.getDefault().register(context, LoginViewModel.TOKEN_LOGINVIEWMODEL_REFRESH, new BindingAction() { @Override public void call() {

}

});

在ViewModel中使用发现,Messenger.getDefault() 会报红。

wyzfzu commented 5 years ago

希望添加个不同界面的viewpager例子,还想问不用fragment直接三个不同的viewmodel加上viewpager去能用吗?如果能,该怎么实现? +1,例子中没有体现这一块

goldze commented 5 years ago

@oldfish96 viewpager+fragment你以前怎么做的,现在就怎么做, 不是非得用viewpager的绑定去实现

goldze commented 5 years ago

@wyzfzu 同上

jackandroid2016 commented 5 years ago

BR文件没有自动生成,怎么办

jackandroid2016 commented 5 years ago

MVVMHabit image

goldze commented 5 years ago

@jackandroid2016 请参考文档 【4.1.4、自动生成类错误】小节

Shouheng88 commented 5 years ago
package me.goldze.mvvmhabit.base;

import android.app.Activity;
import android.support.v4.app.Fragment;

import java.util.Stack;

/**
 * Created by goldze on 2017/6/15.
 * activity堆栈式管理
 */
public class AppManager {

    private static Stack<Activity> activityStack;
    private static Stack<Fragment> fragmentStack;
    private static AppManager instance;

    private AppManager() {
    }

    /**
     * 单例模式
     *
     * @return AppManager
     */
    public static AppManager getAppManager() {
        if (instance == null) {
            instance = new AppManager();
        }
        return instance;
    }

}

单例并不是线程安全的?而且 Demo app 里面存在多个内存泄漏(需要截图的话可以提供给你)

goldze commented 5 years ago

@Shouheng88 这个位置的单例会在Activity创建销毁时调用, 不用担心线程问题, 内存泄漏问题应该是hwPhone.Window.mContext造成的, 与框架无关

wuao commented 5 years ago

我也在做这样一个基础的sdk 框架 我觉得文件下载功能在稍微强大一点 支持断点续传和下载 关于sdk 初始化的时候可以 不要自己再去开启log 而是 外部提供一份默认的 init 的功能 也支持自己自定义就想你自己这样 但是 log 这种 可以自己 根据是否是debug 自动开启 这个不需要自己再去专门写了

goldze commented 5 years ago

@wuao 好的, 感谢提醒!

ToweR10 commented 5 years ago

看你的列表数据的子view使用的是viewModel代替adapter,而你这个viewModel是new出来的,如果我要在这个viewModel里开一个线程,那有多少个viewModel就开了多少个线程,我觉得这样很不科学啊。

goldze commented 5 years ago

@ToweR10 ItemViewModel类似于ViewHolder, 并不是adapter, ItemViewModel的UI操作在Adapter中处理,就像ViewModel的Ui操作在Activity/Fragment中处理一样, 具体怎么开线程, 根据你的业务来做

MelvinCen commented 5 years ago

baseFragment要是能够懒加载就更好啦

goldze commented 5 years ago

@MelvinCen 有这个的需求, 你可以自己写一个BaseLazyFragment extends BaseFragment 抽象一个initLazyData()方法

tinybright commented 5 years ago

qq 20181115152235 该方法在更新后无法显示recycleview里的间距 条目都挤在一起

Cazaea commented 5 years ago

一个模仿网易云的APP

我一边参考你的Demo,一边看那个项目,我已经懵了...

顺便说一下,感觉您封装的代码中存在较多不太严谨的【warnings】

18357588507 commented 5 years ago

布局xml中有自定义视图时,自动生成的绑定类中import 会将自定义视图中径名作为类包引入,导致无法自动生成的类出错。

tinybright commented 5 years ago

DividerLine里getItemOffsets啥也不干了?现在没任何分割线了

983045775 commented 5 years ago

请问有数据库的使用案例吗

zhongwenvc commented 5 years ago

ContainerActivity 中的 generateViewId()生成不重复的id不支持api16,能否优化一下?

rmtic commented 5 years ago

弄提供一些自定义服务器异常状态处理的Demo吗

Yishiba commented 5 years ago

希望添加个不同界面的viewpager例子,还想问不用fragment直接三个不同的viewmodel加上viewpager去能用吗?如果能,该怎么实现?

这个问题我也遇到了,先来这里看看有没有解决方法。

983045775 commented 5 years ago

lib库中binding的image里的ViewAdapter 封装Glide用的image.getcontext 会报错 java.lang.IllegalArgumentException You cannot start a load for a destroyed activity

gwang72-supplier commented 5 years ago

viewModel不能持有Activity Fragment等的引用,这块总是需要从activity或fragment传值到viewModel,很不方便,希望作者可以改进下!

yonggege2013 commented 5 years ago

Build version: 1.3.8 Build date: 1979-11-30 00:00:00 Current date: 2019-01-23 04:27:48 Device: Genymotion Google Nexus 5X - 7.0.0 - API 24 - 1080x1920

Stack trace: java.lang.NoSuchMethodError: No virtual method getLifecycle()Landroid/arch/lifecycle/Lifecycle; in class Lme/goldze/mvvmhabit/base/BaseActivity; or its super classes (declaration of 'me.goldze.mvvmhabit.base.BaseActivity' appears in /data/app/com.xxx.xx-1/split_lib_slice_5_apk.apk) at me.goldze.mvvmhabit.base.BaseActivity.initViewDataBinding(BaseActivity.java:87) at me.goldze.mvvmhabit.base.BaseActivity.onCreate(BaseActivity.java:42) at android.app.Activity.performCreate(Activity.java:6664) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2599) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707) at android.app.ActivityThread.-wrap12(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:6077) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)

goldze commented 5 years ago

@wanggang123 正在考虑这个问题, 感谢反馈!

goldze commented 5 years ago

@983045775 感谢反馈, 这个问题我也发现了, 正在考虑优化

goldze commented 5 years ago

@Yishiba @oldfish96 新例子中已经给出了ViewPager+Fragment的示例

lhlhlh111000 commented 5 years ago

me.goldze.mvvmhabit.binding.viewadapter.scrollview下的ViewAdapter中onScrollChangeCommand方法的回调写法new ScrollDataWrapper(scrollView.getScaleX(), scrollView.getScrollY());X方向的偏移量是故意这样写的还是笔误了?

goldze commented 5 years ago

@lhlhlh111000 这个位置是笔误,看的非常细心,感谢指出!

rmtic commented 5 years ago

startContainerActivity 如果当前页面是 containerActivity ,再次执行startContainerActivity 没有继续调整怎么解决

lexluthors commented 5 years ago

可以把sdk版本升级到28吗?我新建项目引入框架之后appcompat版本报错。只能改成27.0.2。

XYDong commented 5 years ago

为什么只能使用layout作为布局文件的根布局?

OneDayNoMore commented 5 years ago

Service怎么开启和关闭?

brady2037 commented 5 years ago

建议后续迁移到 androidx

我看了谷歌一些开源项目,已经转移到AndroidX了 谷歌也说后面只更新AndroidX,不更换新Support系列了 以及Material Design和Material Theming也是基于AndroidX的 以及基于AndroidX可以对单独对Fragment进行测试

tinybright commented 5 years ago

开个androidx分支还差不多,你一迁移,其他依赖你的要升级也得迁移

brady2037 commented 5 years ago

开个androidx分支还差不多,你一迁移,其他依赖你的要升级也得迁移

这种升级自己的项目肯定也是要一起的,而且以后早晚也是要迁移的,就如Eclipse到Android Studio

XiaMuYao commented 5 years ago

Kotlin中使用会出现问题

var onClickToast = BindingCommand<MainViewModel>(BindingAction { ToastUtils.showLongMessage(context, "显示的信息")})

在XMl中绑定之后会直接执行这个方法 然而我并没有点击

brady2037 commented 5 years ago

请教下如何在接口请求后统一处理返回结果,如统一更新返回结果中的token 发现 ApiDisposableObserver 这个类,但是没有使用示例,目前我是这么使用的:

addSubscribe(model.getTempToken().subscribeWith(new ApiDisposableObserver<BasicResponse<GetTempTokenRes>>() {
            @Override
            public void onResult(BasicResponse<GetTempTokenRes> response) {

            }
        }));

另外在RxUtils->exceptionTransformer()中使用map()也可以拦截请求结果,推荐使用哪种呢

brady2037 commented 5 years ago

接口请求中发生异常时不会回调Rxutil下ExceptionHandle

完整图片

brady2037 commented 5 years ago

接口请求中发生异常时不会回调Rxutil下ExceptionHandle

完整图片

发现是Rxjava2中的处理逻辑问题,内部对onNext进行了一个try-catch导致的 LambdaObserver.clas

@Override
public void onNext(T t) {
    if (!isDisposed()) {
        try {
            onNext.accept(t);
        } catch (Throwable e) {
            Exceptions.throwIfFatal(e);
            get().dispose();    <-- Observer is disposed
            onError(e);  <-- Here does attempt to propagate error, however onError() check state of observer and do nothing.
        }
    }
}

参考:RxJava issues-5388

JongLim107 commented 5 years ago

startContainerActivity 如果当前页面是 containerActivity ,再次执行startContainerActivity 没有继续调整怎么解决

同样有过疑虑,另外有个问题就是盛装Fragment的ContainerActivity没有支持自定义Toolbar的呀。

ywqzzy commented 5 years ago

请问onTouch事件的绑定是不是不可做?项目中需要监听按键时长