2024年最新Android Compose 新闻App(一)网络框架搭建(1),2024年最新阿里社招四面后

最后

针对Android程序员,我这边给大家整理了一些资料,包括不限于高级UI、性能优化、架构师课程、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter等全方面的Android进阶实践技术;希望能帮助到大家,也节省大家在网上搜索资料的时间来学习,也可以分享动态给身边好友一起学习!

往期Android高级架构资料、源码、笔记、视频。高级UI、性能优化、架构师课程、混合式开发(ReactNative+Weex)全方面的Android进阶实践技术,群内还有技术大牛一起讨论交流解决问题。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

/**

  • 请求接口成功状态描述

*/

const val SUCCESS = “success”

}

这里就是一个常量类,我们在请求API接口时会用到的一些不变的值就放这里。然后我们在network包下新建一个ApiService接口,代码如下:

interface ApiService {

/**

  • 获取新闻数据

*/

@GET(“/ncov/index?key=$API_KEY”)

fun getEpidemicNews(): Call

}

下面我们在network包下新建一个发起请求的NetworkRequest类,代码如下:

object NetworkRequest {

/**

  • 创建服务

*/

private val service = ServiceCreator.create(ApiService::class.java)

//通过await()函数将getNews()函数也声明成挂起函数。使用协程

suspend fun getEpidemicNews() = service.getEpidemicNews().await()

/**

  • Retrofit网络返回处理

*/

private suspend fun Call.await(): T = suspendCoroutine {

enqueue(object : Callback {

//正常返回

override fun onResponse(call: Call, response: Response) {

val body = response.body()

if (body != null) it.resume(body)

else it.resumeWithException(RuntimeException(“response body is null”))

}

//异常返回

override fun onFailure(call: Call, t: Throwable) {

it.resumeWithException(t)

}

})

}

}

这段代码解释一下:首先我们使用ServiceCreator创建了一个ApiService接口的动态代理对象,然后定义了一个getEpidemicNews函数,调用刚刚在ApiService中定义的getEpidemicNews方法,以发起疫情新闻数据请求。这里简化了Retrofit回调的写法,这里定义了一个await()函数,它是一个挂起函数,我们给它声明了一个泛型T,并将await()函数定义成了Call< T >的扩展函数,这样所有返回值是Call类型的Retrofit网络请求接口都可以直接调用await()函数了。

接着,await()函数中使用了suspendCoroutine函数来挂起当前协程,并且由于扩展函数的原因,我们现在拥有了Call对象的上下文,那么这里就可以直接调用enqueue()方法让Retrofit发起网络请求。

最后我们在存储库中发起数据请求,在com.llw.goodnews下创建一个repository包,包下新建一个BaseRepository,里面的代码如下:

open class BaseRepository {

fun fire(context: CoroutineContext, block: suspend () -> Result) =

liveData(context) {

val result = try {

block()

} catch (e: Exception) {

Result.failure(e)

}

//通知数据变化

emit(result)

}

}

这里的fire()函数,按照liveData()函数的参数接收标准定义的一个高阶函数。在fire()函数的内部会先调用一下liveData()函数,然后在liveData()函数的代码块中统一进行try catch处理,并在try语句中调用传入的Lambda表达式中的代码,最终Lambda表达式的执行结果并调用emit()方法发射出去。

然后我们在repository包下再新建一个EpidemicNewsRepository类,用于请求疫情新闻数据,继承自BaseRepository,里面的代码如下:

object EpidemicNewsRepository : BaseRepository() {

fun getEpidemicNews() = fire(Dispatchers.IO) {

val epidemicNews = NetworkRequest.getEpidemicNews()

if (epidemicNews.code == CODE) Result.success(epidemicNews)

else Result.failure(RuntimeException(“getNews response code is ${epidemicNews.code} msg is ${epidemicNews.msg}”))

}

}

这里我们调用父类的fire()函数,将liveData()函数的线程参数类型指定成了Dispatchers.IO,这样的代码块中的所有代码都是运行在子线程中,如果请求状态码是200,则表示成功,那么就使用Kotlin内置的Result.success()方法来包装获取的疫情新闻数据,然后就调用Result.failure()方法来包装一个异常信息。

那么到这里为止,网络框架就搭建完成了,要使用的话还需要一些配置:

五、项目配置


这里我们在com.llw.goodnews包下自定义一个App类,继承自Application,代码如下:

class App : Application() {

companion object {

@SuppressLint(“StaticFieldLeak”)

lateinit var context: Context

}

override fun onCreate() {

super.onCreate()

context = applicationContext

}

}

然后因为我们访问的API是http开头的,在Android9.0及以上版本中默认访问https,因此我们需要打开对http的网络访问,在res文件夹下新建一个xml文件夹,在xml文件夹下创建一个network_config.xml,里面的代码如下:

<?xml version="1.0" encoding="utf-8"?>

然后我们在AndroidManifest.xml中去配置,如下图所示:

在这里插入图片描述

现在万事具备,只差请求了。

六、网络请求


进入到MainActivity,新增如下代码:

EpidemicNewsRepository.getEpidemicNews().observe(this@MainActivity) { result ->

val epidemicNews = result.getOrNull()

if (epidemicNews != null) {

Log.d(“TAG”, “onCreate: ${epidemicNews.code}”)

Log.d(“TAG”, “onCreate: ${epidemicNews.msg}”)

Log.d(“TAG”, “onCreate: ${epidemicNews.newslist?.get(0)?.news?.get(0)?.title}”)

Log.d(“TAG”, “onCreate: ${epidemicNews.newslist?.get(0)?.news?.get(0)?.summary}”)

} else {

Log.e(“TAG”, “onCreate: null”)

}

}

添加的位置为下图所示:

在这里插入图片描述

这里就是通过请求返回数据,然后打印一下数据,下面来运行一下:

在这里插入图片描述

OK,网络框架就没有啥问题了,主要有一个点不爽,就是这里的bean里面太多类,我们写到一个类里面,修改一下EpidemicNews.kt,里面的代码如下:

data class EpidemicNews(val msg: String = “”,

val code: Int = 0,

val newslist: List?)

data class NewslistItem(val news: List?,

val desc: Desc,

val riskarea: Riskarea)

data class NewsItem(val summary: String = “”,

val sourceUrl: String = “”,

val id: Int = 0,

val title: String = “”,

val pubDate: Long = 0,

val pubDateStr: String = “”,

val infoSource: String = “”)

data class Desc(val curedCount: Int = 0,

val seriousCount: Int = 0,

val currentConfirmedIncr: Int = 0,

val midDangerCount: Int = 0,

val suspectedIncr: Int = 0,

val seriousIncr: Int = 0,

val confirmedIncr: Int = 0,

val globalStatistics: GlobalStatistics,

val deadIncr: Int = 0,

val suspectedCount: Int = 0,

val currentConfirmedCount: Int = 0,

val confirmedCount: Int = 0,

val modifyTime: Long = 0,

val createTime: Long = 0,

val curedIncr: Int = 0,

val yesterdaySuspectedCountIncr: Int = 0,

val foreignStatistics: ForeignStatistics,

val highDangerCount: Int = 0,

val id: Int = 0,

val deadCount: Int = 0,

val yesterdayConfirmedCountIncr: Int = 0)

data class Riskarea(val high: List?,

val mid: List?)

data class GlobalStatistics(val currentConfirmedCount: Int = 0,

val confirmedCount: Int = 0,

val curedCount: Int = 0,

val currentConfirmedIncr: Int = 0,

val confirmedIncr: Int = 0,

val curedIncr: Int = 0,

val deadCount: Int = 0,

val deadIncr: Int = 0,

val yesterdayConfirmedCountIncr: Int = 0)

学习分享

在当下这个信息共享的时代,很多资源都可以在网络上找到,只取决于你愿不愿意找或是找的方法对不对了

很多朋友不是没有资料,大多都是有几十上百个G,但是杂乱无章,不知道怎么看从哪看起,甚至是看后就忘

如果大家觉得自己在网上找的资料非常杂乱、不成体系的话,我也分享一套给大家,比较系统,我平常自己也会经常研读。

2021最新上万页的大厂面试真题

七大模块学习资料:如NDK模块开发、Android框架体系架构…

只有系统,有方向的学习,才能在段时间内迅速提高自己的技术。

这份体系学习笔记,适应人群:
**第一,**学习知识比较碎片化,没有合理的学习路线与进阶方向。
**第二,**开发几年,不知道如何进阶更进一步,比较迷茫。
**第三,**到了合适的年纪,后续不知道该如何发展,转型管理,还是加强技术研究。

由于文章内容比较多,篇幅不允许,部分未展示内容以截图方式展示 。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

-SzLCKvCq-1715907854070)]

只有系统,有方向的学习,才能在段时间内迅速提高自己的技术。

这份体系学习笔记,适应人群:
**第一,**学习知识比较碎片化,没有合理的学习路线与进阶方向。
**第二,**开发几年,不知道如何进阶更进一步,比较迷茫。
**第三,**到了合适的年纪,后续不知道该如何发展,转型管理,还是加强技术研究。

由于文章内容比较多,篇幅不允许,部分未展示内容以截图方式展示 。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 26
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值