Giter Club home page Giter Club logo

wanandroid's Introduction

之前的 README 文件(在这里可以看到 真香!Kotlin+MVVM+LiveData+协程 打造 Wanandroid!) 和现有代码其实已经有较大出入,也包含了一些不正确的观点,回来更新一下。

翻一下提交记录,第一次 commit 是在 13 Mar 2018 ,没记错的话当时是基于 MVP 模式搭建的基础框架,到现在经过 100 多次 commit,整个框架已经完全更新。最新的代码在 mvvm-kotlin 分支。

刚从 MVP 过渡到 MVVM ,挺兴奋的,一股脑刷刷的写,其实犯了很多错误。第一次认识到关于 MVVM 的一些错误理解是通过这篇文章 关于MVC/MVP/MVVM的一些错误认识 ,大家可以仔细阅读这篇文章。

随着对架构的逐步深入认识,对 MVVM 的概念又逐渐模糊起来。在 Android 开发中,到底什么是 MVVM 架构?

数据驱动 UI ?

ViewModel + LiveData ?

不使用 Databinding 是不是 MVVM ?

不使用双向绑定是不是 MVVM ?

一时之间好像遍地都是 Jetpack MVVM 的相关文章和开源项目,但我却愈发觉得这算不上真正的 MVVM 。我更愿意称之为 变种 MVP ,或者它就是 Jetpack 架构

上面这张图就可以清晰的表达它的架构,它不是 MVP,也不是 MVVM

当然,每个人心中都有自己的架构,欢迎到 issue 区表达自己的看法。

最后简单罗列一下项目的技术点:

  • LiveData 作为数据容器,由 ViewModel 进行保存
  • Databinding 负责数据绑定工作
  • 使用 Kotlin Coroutines 完成网络请求等耗时异步任务,其中登录页面尝试使用了 flow
  • koin 负责依赖注入工作
  • ......

作为一个试错项目,后续可能继续引入各种新奇类库或者 gradle 插件,欢迎继续关注。

最后给我的专栏打个广告:

Android 面试进阶指南目录

计算机网络

  1. http 速查

Android

  1. 唠唠任务栈,返回栈和启动模式
  2. 唠唠 Activity 的生命周期
  3. 扒一扒 Context
  4. 面试官:为什么不能使用 Application Context 显示 Dialog?
  5. 面试官:OOM 可以被 try catch 吗?
  6. 面试官:Activity.finish() 之后十秒才回调 onDestroy ?
  7. 面试官:如何监测应用的 FPS ?

添加微信 bingxinshuo_ ,加入技术交流群 。

wanandroid's People

Contributors

lulululbj avatar ppjuns avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

wanandroid's Issues

结束loading状态可以这样加个finishBlock么

fun executeResponse(
response: MyResponse, successBlock: () -> Unit,
errorBlock: () -> Unit
, finishBlock: () -> Unit
) {
if (response.code == -1) {
errorBlock()
} else {
successBlock()
}
finishBlock()
}

错误返回的问题

image
我看到在LoginRepository中的错误信息是在前台写死的,如果我想返回后台返回的错误日志应该怎么处理呢?

retrofit2相关问题

suspend fun login(@field("username") userName: String, @field("password") passWord: String): WanResponse ,我看你这里都是返回WanResponse,为什么我模仿写的时候retrofit一直报错Unable to create call adapter for luyao.wanandroid.model.bean.WanResponse<com.lin.wyt.coroutine.bean.NewGrade>

Json转数据类

您好,Json字符串转数据类有插件吗?类似GsonFormat

关于 Retrofit 2.6.0 对协程的支持

看了下代码一直没看明白怎么把 Retrofit 返回的 Call 转换为具体的实体类,后来查了下是 Retrofit 2.6.0 添加了对协程的支持,可以直接返回了,可以在 README 更新说明下。

就Retrofit协程有些问题请教

在用协程替换RxJava的情况下,协程有相关api能做到例如RxJava zip处理多个网络请求、retryWhen处理错误重试吗?

[Build Error] Unresolved reference: liveData

Android Studio : 3.4.1
Gradle: com.android.tools.build:gradle:3.4.2
Kotlin: ext.kotlin_version = '1.3.31'
Error Message:
luyao/wanandroid/ui/home/HomeViewModel.kt
(23, 45): Unresolved reference: liveData
(24, 21): Suspend function 'withContext' should be called only from a coroutine or another suspend function
(25, 9): Unresolved reference: emit

buildSrc 一直找不到依赖

buildSrc 一直找不到依赖

Could not get unknown property 'Versions' for extension 'android' of type com.android.build.gradle.internal.dsl.BaseAppModuleExtension.

各种重启,清缓存都没用 ,androidstudio4.0 gradle 6.1.1 kotlin1.3.72

有两个问题,希望大佬指教!

SquareViewModel:

data class SquareUiModel(
val showLoading: Boolean,
val showError: String?,
val showSuccess: ArticleList?,
val showEnd: Boolean, // 加载更多
val isRefresh: Boolean, // 刷新
val needLogin: Boolean? = null
)

1.每个viewmodel 中有一个model,这种model 有没有办法共用?
2.还有个问题请教大佬 如果是DialogFragment 怎么用viewmodel ,在假如 我继承BaseVMFragment 我没有viewmodel 咋处理啊?

内存泄漏

BrowserNormalActivity->WebSettingsExtension.mContext

找不到下面的4个文件。

关于看了代码第一点浅显理解

1.首页 Tab+ViewPager+Fragment
FragmentPagerAdapter(supportFragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT)
这段代码的原意是让不可见的Fragment执行到onResume 之前 ,但是我发现BaseFragment的初始化操作全部都放在了onCreateView中 这样使得懒加载失效,那么这些初始化操作是否应该放在onResume中进行操作,使用变量控制判断是否初始化已完成

viewmodel中的写法

为什么要两个livedata 用一个然后private set 是一样的效果吗

 private val _uiState = MutableLiveData<ArticleUiModel>()
    val uiState: LiveData<ArticleUiModel>
        get() = _uiState

异常处理的问题

大佬,请教个问题。。

suspend fun login(@Field("username") userName: String, @Field("password") passWord: String): WanResponse<User>

这么写的话,我想根据401,403的错误码进行特定提示或者后续操作,该怎么捕捉这种http异常呢

是在safeApiCall的try,catch中,if(e is HttpException)这样吗。

关于把网络请求丢在Repository层

兄弟你好,拜读了代码,有一个疑问
把网络请求丢在Repository层该怎么取消网络请求呢
看您的代码是在Repository处理网络请求,VM把请求数据转化为LiveData
类似于之前call.cancel()或者Rxjava中取消观察这种

这个项目的混淆文件有吗?

看了一下项目,对比其他的mvvm+jetpack+协程,感觉这个项目是写的最好,想把大神的这套框架用到新的项目中,这个混淆文件有吗?

线程堆栈大小调整

大佬,看到你的公众号文章OOM优化,评论中有提到线程优化的两个方案:

  1. 使用xhook减小pthread_attr_setstacksize,设置线程堆栈缩小一半
  2. 监控应用线程数和堆栈信息。在OOM时上报吗?
    能帮帮详细说说吗?特别是xhook修改线程大小,找到了xhook的demo,不知道怎么写。有这块的代码就最好了。

文件找不到

import luyao.dependencies.Deps
import luyao.dependencies.Versions

异常处理

我在使用中 发现 无网络情况下会奔溃 ,搜了一下
建议使用 runCatching{
}

包裹请求代码
通过 result 返回异常 做处理

无法run起来

报错信息如下:
2019-12-30 14:33:59.604 22417-22417/? E/AndroidRuntime: FATAL EXCEPTION: main
Process: luyao.wanandroid, PID: 22417
java.lang.RuntimeException: Unable to start activity ComponentInfo{luyao.wanandroid/luyao.wanandroid.ui.NavigationActivity}: android.view.InflateException: Binary XML file line #8 in luyao.wanandroid:layout/activity_navigation: Binary XML file line #8 in luyao.wanandroid:layout/activity_navigation: Error inflating class fragment
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3270)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016)
at android.os.Handler.dispatchMessage(Handler.java:107)

@lulululbj @gdmec07120731

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.