Closed goldze closed 4 years ago
有一个地方应该是有问题的。ViewModel不能持有Activity Fragment等的引用。
AppManager内下述方法逻辑错误应该改为 /**
@archangellcc 感谢反馈
@long66xu 请参见文章4.1.3小节
希望添加个不同界面的viewpager例子,还想问不用fragment直接三个不同的viewmodel加上viewpager去能用吗?如果能,该怎么实现?
感觉这根本不是mvvm,只是使用了一个databinding而已,业务逻辑写得更像之前的mvc了,viewmodule或者livedata根本没用
ViewModel的生成不该用new,有回收风险,用官方提供的ViewModel比较好. livedata和ObservableField 用一个就可以了. 这的确是MMVM啊.
Messenger.getDefault().register(context, LoginViewModel.TOKEN_LOGINVIEWMODEL_REFRESH, new BindingAction() { @Override public void call() {
}
});
在ViewModel中使用发现,Messenger.getDefault() 会报红。
希望添加个不同界面的viewpager例子,还想问不用fragment直接三个不同的viewmodel加上viewpager去能用吗?如果能,该怎么实现? +1,例子中没有体现这一块
@oldfish96 viewpager+fragment你以前怎么做的,现在就怎么做, 不是非得用viewpager的绑定去实现
@wyzfzu 同上
BR文件没有自动生成,怎么办
MVVMHabit
@jackandroid2016 请参考文档 【4.1.4、自动生成类错误】小节
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 里面存在多个内存泄漏(需要截图的话可以提供给你)
@Shouheng88 这个位置的单例会在Activity创建销毁时调用, 不用担心线程问题, 内存泄漏问题应该是hwPhone.Window.mContext造成的, 与框架无关
我也在做这样一个基础的sdk 框架 我觉得文件下载功能在稍微强大一点 支持断点续传和下载 关于sdk 初始化的时候可以 不要自己再去开启log 而是 外部提供一份默认的 init 的功能 也支持自己自定义就想你自己这样 但是 log 这种 可以自己 根据是否是debug 自动开启 这个不需要自己再去专门写了
@wuao 好的, 感谢提醒!
看你的列表数据的子view使用的是viewModel代替adapter,而你这个viewModel是new出来的,如果我要在这个viewModel里开一个线程,那有多少个viewModel就开了多少个线程,我觉得这样很不科学啊。
@ToweR10 ItemViewModel类似于ViewHolder, 并不是adapter, ItemViewModel的UI操作在Adapter中处理,就像ViewModel的Ui操作在Activity/Fragment中处理一样, 具体怎么开线程, 根据你的业务来做
baseFragment要是能够懒加载就更好啦
@MelvinCen 有这个的需求, 你可以自己写一个BaseLazyFragment extends BaseFragment 抽象一个initLazyData()方法
该方法在更新后无法显示recycleview里的间距 条目都挤在一起
布局xml中有自定义视图时,自动生成的绑定类中import 会将自定义视图中径名作为类包引入,导致无法自动生成的类出错。
DividerLine里getItemOffsets啥也不干了?现在没任何分割线了
请问有数据库的使用案例吗
ContainerActivity 中的 generateViewId()生成不重复的id不支持api16,能否优化一下?
弄提供一些自定义服务器异常状态处理的Demo吗
希望添加个不同界面的viewpager例子,还想问不用fragment直接三个不同的viewmodel加上viewpager去能用吗?如果能,该怎么实现?
这个问题我也遇到了,先来这里看看有没有解决方法。
lib库中binding的image里的ViewAdapter 封装Glide用的image.getcontext 会报错 java.lang.IllegalArgumentException You cannot start a load for a destroyed activity
viewModel不能持有Activity Fragment等的引用,这块总是需要从activity或fragment传值到viewModel,很不方便,希望作者可以改进下!
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)
@wanggang123 正在考虑这个问题, 感谢反馈!
@983045775 感谢反馈, 这个问题我也发现了, 正在考虑优化
@Yishiba @oldfish96 新例子中已经给出了ViewPager+Fragment的示例
me.goldze.mvvmhabit.binding.viewadapter.scrollview下的ViewAdapter中onScrollChangeCommand方法的回调写法new ScrollDataWrapper(scrollView.getScaleX(), scrollView.getScrollY());X方向的偏移量是故意这样写的还是笔误了?
@lhlhlh111000 这个位置是笔误,看的非常细心,感谢指出!
startContainerActivity 如果当前页面是 containerActivity ,再次执行startContainerActivity 没有继续调整怎么解决
可以把sdk版本升级到28吗?我新建项目引入框架之后appcompat版本报错。只能改成27.0.2。
为什么只能使用layout作为布局文件的根布局?
Service怎么开启和关闭?
建议后续迁移到 androidx
我看了谷歌一些开源项目,已经转移到AndroidX了 谷歌也说后面只更新AndroidX,不更换新Support系列了 以及Material Design和Material Theming也是基于AndroidX的 以及基于AndroidX可以对单独对Fragment进行测试
开个androidx分支还差不多,你一迁移,其他依赖你的要升级也得迁移
开个androidx分支还差不多,你一迁移,其他依赖你的要升级也得迁移
这种升级自己的项目肯定也是要一起的,而且以后早晚也是要迁移的,就如Eclipse到Android Studio
Kotlin中使用会出现问题
var onClickToast = BindingCommand<MainViewModel>(BindingAction { ToastUtils.showLongMessage(context, "显示的信息")})
在XMl中绑定之后会直接执行这个方法 然而我并没有点击
请教下如何在接口请求后统一处理返回结果,如统一更新返回结果中的token
发现 ApiDisposableObserver
这个类,但是没有使用示例,目前我是这么使用的:
addSubscribe(model.getTempToken().subscribeWith(new ApiDisposableObserver<BasicResponse<GetTempTokenRes>>() {
@Override
public void onResult(BasicResponse<GetTempTokenRes> response) {
}
}));
另外在RxUtils->exceptionTransformer()中使用map()也可以拦截请求结果,推荐使用哪种呢
接口请求中发生异常时不会回调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.
}
}
}
startContainerActivity 如果当前页面是 containerActivity ,再次执行startContainerActivity 没有继续调整怎么解决
同样有过疑虑,另外有个问题就是盛装Fragment的ContainerActivity没有支持自定义Toolbar的呀。
请问onTouch事件的绑定是不是不可做?项目中需要监听按键时长
如果您在使用中发现存在Bug,请在此提出,感谢您的反馈!