Android:组织代码-改型2样板

Android:组织代码-改型2样板,android,kotlin,mvvm,retrofit2,clean-architecture,Android,Kotlin,Mvvm,Retrofit2,Clean Architecture,我试图组织我的代码,并减少空间锅炉板代码占用的数量 一个例子是初始化并联系web服务器的改造2锅炉板 在我的Android(Kotlin)项目中,我使用的是MVVM w/存储库模式。在我的回购协议中,我有以下内容: 回购: val改装=改装.Builder() .baseUrl(网站) .addConverterFactory(GsonConverterFactory.create()) .build() val对象:对象=改装。创建( 对象::class.java) val调用:call=ob

我试图组织我的代码,并减少空间锅炉板代码占用的数量

一个例子是初始化并联系web服务器的改造2锅炉板

在我的Android(Kotlin)项目中,我使用的是MVVM w/存储库模式。在我的回购协议中,我有以下内容:

回购:

val改装=改装.Builder()
.baseUrl(网站)
.addConverterFactory(GsonConverterFactory.create())
.build()
val对象:对象=改装。创建(
对象::class.java)
val调用:call=objectApi.getInformation(值)
排队(对象:Callback{
覆盖失效时的乐趣(调用:调用,t:可丢弃){
Log.d(“测试”,“错误:${t.message}”)
}
覆盖fun onResponse(调用:调用,响应:响应){
Log.d(“测试”,“成功:${response.body()}”)
}
})
我希望能够通过将代码放在不同的文件中来减少我的repo中的代码,从而可以看到更重要的内容。我正在努力提高我的代码质量


谢谢

如果使用干净架构的MVVM, 然后你需要分离MVVM的所有部分, 类似-模型、视图、视图模型

在哪里 模型对数据负责 视图负责UI部件 viewmodel负责逻辑部分

在使用改型调用api的情况下,必须创建一个存储库类,该类负责所有数据。 数据可以是数据库、sharepreference、api调用。 所有的数据都要经过存储库

在干净的体系结构中,您必须为Api调用、本地数据库和视图创建单独的模块

有关更多信息,您可以浏览以下代码存储库:


如果您使用具有干净体系结构的MVVM, 然后你需要分离MVVM的所有部分, 类似-模型、视图、视图模型

在哪里 模型对数据负责 视图负责UI部件 viewmodel负责逻辑部分

在使用改型调用api的情况下,必须创建一个存储库类,该类负责所有数据。 数据可以是数据库、sharepreference、api调用。 所有的数据都要经过存储库

在干净的体系结构中,您必须为Api调用、本地数据库和视图创建单独的模块

有关更多信息,您可以浏览以下代码存储库:

//StackOverflowApi.kt

    interface StackOverflowApi {
    
        @GET("/questions/{questionId}?site=stackoverflow&filter=withbody")
        suspend fun questionDetails(@Path("questionId") questionId: String?): Response<SingleQuestionResponseSchema>
     }
//QuestionDetailsRepository.kt

class QuestionDetailsRepository(
    private val stackOverflowRemoteDataSource: StackOverflowRemoteDataSource,
    private val dataMapper: DataMapper
)  {


    private var mCallJob: Job? = null
    fun fetchQuestionDetailsAndNotify(questionId: String) {
        cancelCurrentFetchIfActive()
        mCallJob = CoroutineScope(Dispatchers.IO).launch {
            val result = stackOverflowRemoteDataSource.fetchQuestionDetails(questionId)
            if (result.status == APIResult.Status.SUCCESS) {
                val questionDetail =
                    dataMapper.questionDetailMapper.transformDTOToModel(result.data?.question!!)
                withContext(Dispatchers.Main) {
                    notifySucceeded(questionDetail)
                }
            } else if (result.status == APIResult.Status.ERROR) {
                withContext(Dispatchers.Main) {
                    notifyFailed()
                }
            }
        }
    }

    private fun cancelCurrentFetchIfActive() {
        if (mCallJob != null) {
            mCallJob?.cancel()
        }
    }

    private fun notifySucceeded(question: QuestionDetails) {
    }

    private fun notifyFailed() {
    }
}
//StackOverflowRemoteDataSource.kt

class StackOverflowRemoteDataSource(private val service: StackOverflowApi) :
    BaseRemoteDataSource() {

    suspend fun fetchLastActiveQuestions(pageSize: Int) =
        getResult { service.lastActiveQuestions(pageSize) }

    suspend fun fetchQuestionDetails(questionId: String) =
        getResult { service.questionDetails(questionId) }
}
//StackOverflowApi.kt

    interface StackOverflowApi {
    
        @GET("/questions/{questionId}?site=stackoverflow&filter=withbody")
        suspend fun questionDetails(@Path("questionId") questionId: String?): Response<SingleQuestionResponseSchema>
     }
//QuestionDetailsRepository.kt

class QuestionDetailsRepository(
    private val stackOverflowRemoteDataSource: StackOverflowRemoteDataSource,
    private val dataMapper: DataMapper
)  {


    private var mCallJob: Job? = null
    fun fetchQuestionDetailsAndNotify(questionId: String) {
        cancelCurrentFetchIfActive()
        mCallJob = CoroutineScope(Dispatchers.IO).launch {
            val result = stackOverflowRemoteDataSource.fetchQuestionDetails(questionId)
            if (result.status == APIResult.Status.SUCCESS) {
                val questionDetail =
                    dataMapper.questionDetailMapper.transformDTOToModel(result.data?.question!!)
                withContext(Dispatchers.Main) {
                    notifySucceeded(questionDetail)
                }
            } else if (result.status == APIResult.Status.ERROR) {
                withContext(Dispatchers.Main) {
                    notifyFailed()
                }
            }
        }
    }

    private fun cancelCurrentFetchIfActive() {
        if (mCallJob != null) {
            mCallJob?.cancel()
        }
    }

    private fun notifySucceeded(question: QuestionDetails) {
    }

    private fun notifyFailed() {
    }
}
//StackOverflowRemoteDataSource.kt

class StackOverflowRemoteDataSource(private val service: StackOverflowApi) :
    BaseRemoteDataSource() {

    suspend fun fetchLastActiveQuestions(pageSize: Int) =
        getResult { service.lastActiveQuestions(pageSize) }

    suspend fun fetchQuestionDetails(questionId: String) =
        getResult { service.questionDetails(questionId) }
}

将与api创建相关的代码移动到单独的服务生成器类将与api创建相关的代码移动到单独的服务生成器类谢谢!我将阅读更多关于清洁建筑的文章!非常感谢。我将阅读更多关于清洁建筑的文章!这就是我要找的。我仍然对QuestionDetailsRepository.kt如何调用ApisServiceGenerator.kt有点困惑,因为它们之间没有相互引用。您必须在QuestionDetailsRepository构造函数中传递StackOverflowApi intance,更新我的答案,请参阅StackOverflowRemoteDataSource.kt这就是我要寻找的。对于QuestionDetailsRepository.kt如何调用ApisServiceGenerator.kt,我仍然有点困惑,因为它们彼此不引用。您必须在QuestionDetailsRepository构造函数中传递StackOverflowApi维护,更新我的答案,请参阅StackOverflowRemoteDataSource.kt