Android Compose 新闻App(三)网络数据Compose UI显示加载、Room和DataStore使用

这篇具有很好参考价值的文章主要介绍了Android Compose 新闻App(三)网络数据Compose UI显示加载、Room和DataStore使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Android Compose 新闻App(三)网络数据Compose UI显示加载、Room和DataStore使用,2024年程序员学习,android,ui

正文

===============================================================

后面的内容涉及到样式布局组件,内容比较多。

一、样式


在这里我们先进行样式的配置,打开ui.theme文件夹。

首先是修改Color.kt文件

val Blue200 = Color(0xFF979FF2)

val Blue300 = Color(0xFF6D7DEA)

val Blue700 = Color(0xFF0068C2)

val Blue800 = Color(0xFF0059A5)

val Blue900 = Color(0xFF004076)

然后是Shape.kt文件

val Shapes = Shapes(

small = RoundedCornerShape(4.dp),

medium = RoundedCornerShape(4.dp),

large = RoundedCornerShape(8.dp)

)

再是Theme.kt文件

private val LightColorPalette = lightColors(

primary = Blue700,

primaryVariant = Blue900,

onPrimary = Color.White,

secondary = Blue700,

secondaryVariant = Blue900,

onSecondary = Color.White,

error = Blue800,

onBackground = Color.Black

)

private val DarkColorPalette = darkColors(

primary = Blue300,

primaryVariant = Blue700,

onPrimary = Color.Black,

secondary = Blue300,

onSecondary = Color.Black,

error = Blue200,

onBackground = Color.White

)

@Composable

fun GoodNewsTheme(darkTheme: Boolean = isSystemInDarkTheme(), content: @Composable () -> Unit) {

MaterialTheme(

colors = if (darkTheme) DarkColorPalette else LightColorPalette,

typography = Typography,

shapes = Shapes,

content = content

)

}

最后是Type.kt文件

private val Montserrat = FontFamily(

Font(R.font.montserrat_regular),

Font(R.font.montserrat_medium, FontWeight.W500),

Font(R.font.montserrat_semibold, FontWeight.W600)

)

private val Domine = FontFamily(

Font(R.font.domine_regular),

Font(R.font.domine_bold, FontWeight.Bold)

)

val JetnewsTypography = Typography(

defaultFontFamily = Montserrat,

h4 = TextStyle(

fontWeight = FontWeight.SemiBold,

fontSize = 30.sp,

letterSpacing = 0.sp

),

h5 = TextStyle(

fontWeight = FontWeight.SemiBold,

fontSize = 24.sp,

letterSpacing = 0.sp

),

h6 = TextStyle(

fontWeight = FontWeight.SemiBold,

fontSize = 20.sp,

letterSpacing = 0.sp

),

subtitle1 = TextStyle(

fontWeight = FontWeight.SemiBold,

fontSize = 16.sp,

letterSpacing = 0.15.sp

),

subtitle2 = TextStyle(

fontWeight = FontWeight.Medium,

fontSize = 14.sp,

letterSpacing = 0.1.sp

),

body1 = TextStyle(

fontFamily = Domine,

fontWeight = FontWeight.Normal,

fontSize = 16.sp,

letterSpacing = 0.5.sp

),

body2 = TextStyle(

fontWeight = FontWeight.Medium,

fontSize = 14.sp,

letterSpacing = 0.25.sp

),

button = TextStyle(

fontWeight = FontWeight.SemiBold,

fontSize = 14.sp,

letterSpacing = 1.25.sp

),

caption = TextStyle(

fontWeight = FontWeight.Medium,

fontSize = 12.sp,

letterSpacing = 0.4.sp

),

overline = TextStyle(

fontWeight = FontWeight.SemiBold,

fontSize = 12.sp,

letterSpacing = 1.sp

)

)

这个文件中有一些字体文件,在我项目的res下。

Android Compose 新闻App(三)网络数据Compose UI显示加载、Room和DataStore使用,2024年程序员学习,android,ui

当然你也可以不用这些字体。

下面我们再res文件夹下创建一个values-night文件夹,在里面创建一个colors.xml。里面的代码如下:

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

#0068C2

#004076

#0E0E0E

再去修改values下的colors.xml。

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

#0068C2

#004076

#0068C2

最后修改values.xml下的theme.xml,代码如下:

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

二、Scaffold(脚手架)


你可能是第一次看到这个玩意。Compose 附带内置的 Material 组件可组合项,您可以用他们创建应用。最高级别的可组合项是 Scaffold。Scaffold 可让您实现具有基本 Material Design 布局结构的界面。Scaffold 可以为最常见的顶层 Material 组件(例如 TopAppBar、BottomAppBar、FloatingActionButton 和 Drawer)提供槽位。使用 Scaffold 时,您可以确保这些组件能够正确放置并协同工作。这是它里面提供的一些参数

Android Compose 新闻App(三)网络数据Compose UI显示加载、Room和DataStore使用,2024年程序员学习,android,ui

你或许听说过Compose是声明式UI,但是更多的是插槽 API,插槽 API 是 Compose 引入的一种模式,它在可组合项的基础上提供了一层自定义设置。那么什么是插槽API呢?比如一个Button中有图标和文字,对应的就是Icon和Text,你可以认为这就是插槽。

理论的东西说了很多了,下面来实践一下。在MainActivity.kt中增加一个MainScreen函数

@Composable

private fun MainScreen() {

Scaffold {

}

}

然后在setContent和DefaultPreview中调用,下面我们预览一下:

Android Compose 新闻App(三)网络数据Compose UI显示加载、Room和DataStore使用,2024年程序员学习,android,ui

一篇空白,我们可以把这个Scaffold当成是一个布局。下面我们新增一个TopAppBar

三、TopAppBar(顶部应用栏)


//顶部应用栏

TopAppBar(

title = {

Text(

text = stringResource(id = R.string.app_name),

modifier = Modifier.fillMaxWidth(),

textAlign = TextAlign.Center,

color = MaterialTheme.colors.onSecondary

)

}

)

Android Compose 新闻App(三)网络数据Compose UI显示加载、Room和DataStore使用,2024年程序员学习,android,ui

这里的TopAppBar中设置title参数,然后写一个Text的插槽,设置文字、控件宽度、文字摆放位置、颜色。

下面预览一下:

Android Compose 新闻App(三)网络数据Compose UI显示加载、Room和DataStore使用,2024年程序员学习,android,ui

预览的时候看不到状态栏,我们可以通过真机或者虚拟机来看一下效果。

Android Compose 新闻App(三)网络数据Compose UI显示加载、Room和DataStore使用,2024年程序员学习,android,ui

① 属性值

Android Compose 新闻App(三)网络数据Compose UI显示加载、Room和DataStore使用,2024年程序员学习,android,ui

这里的属性有几个是可以传入插槽的,就是有@Composable注解的,比如我们设置一下navigationIcon和action。

Android Compose 新闻App(三)网络数据Compose UI显示加载、Room和DataStore使用,2024年程序员学习,android,ui

这里我们看到navigationIcon和actions的里面都有一个IconButton,这表示这个图标是可以点击的,然后我们设置点击事件,弹一个Toast,这里是一个扩展函数,我们在utils包下新建一个ToastUtils类,代码如下:

fun String.showToast() = Toast.makeText(App.context, this, Toast.LENGTH_SHORT).show()

fun String.showLongToast() = Toast.makeText(App.context, this, Toast.LENGTH_LONG).show()

fun Int.showToast() = Toast.makeText(App.context, this, Toast.LENGTH_SHORT).show()

fun Int.showLongToast() = Toast.makeText(App.context, this, Toast.LENGTH_LONG).show()

然后我们来解释一下找个Icon里面的内容,Icons.Filled.Person表示的是一个填充的Person图标,它里面是通过Path去绘制的,Icons是androidx.compose.material.icons依赖库里面的,因此不需要我们自己去写,都是material风格的图标。contentDescription就是一个描述,就是说明这个内容是什么意思,不是很重要。下面我们运行一下:

Android Compose 新闻App(三)网络数据Compose UI显示加载、Room和DataStore使用,2024年程序员学习,android,ui

四、列表


我们现在有标题栏了,下面我们写页面主要内容,下面我们在MainActivity.kt中新增一个BodyContent()函数

@Composable

fun BodyContent(modifier: Modifier = Modifier) {

Column(modifier = modifier.padding(8.dp)) {

repeat(100) {

Text(“Item #$it”)

}

}

}

① 显示列表

这个函数需要在MainScreen()函数中调用。

Android Compose 新闻App(三)网络数据Compose UI显示加载、Room和DataStore使用,2024年程序员学习,android,ui

下面运行一下:

Android Compose 新闻App(三)网络数据Compose UI显示加载、Room和DataStore使用,2024年程序员学习,android,ui

② 滑动列表

你会发现你滑动不了,我们只需要加一行代码就可以滑动了,如下图所示:

Android Compose 新闻App(三)网络数据Compose UI显示加载、Room和DataStore使用,2024年程序员学习,android,ui

通过modifier的链式调用verticalScroll()函数,再传进去rememberScrollState()。你可能又会问了,那横向滚动呢?为了区分一下,我再改了这个BodyContent函数。

Android Compose 新闻App(三)网络数据Compose UI显示加载、Room和DataStore使用,2024年程序员学习,android,ui

下面我们运行一下:

Android Compose 新闻App(三)网络数据Compose UI显示加载、Room和DataStore使用,2024年程序员学习,android,ui

好了,现在我们已经掌握了列表的基本使用了,下面我们加上网络请求返回的数据来看。

Android Compose 新闻App(三)网络数据Compose UI显示加载、Room和DataStore使用,2024年程序员学习,android,ui

这里我们就显示这个news的数组数据。

③ 加载网络数据

之前在initData中进行数据请求的返回处理,拿到了返回值,如下图所示:

Android Compose 新闻App(三)网络数据Compose UI显示加载、Room和DataStore使用,2024年程序员学习,android,ui

这里层层传值到BodyContent函数中,在这个函数中我们就来显示数据,函数的代码如下:

@Composable

fun BodyContent(news: List, modifier: Modifier = Modifier) {

LazyColumn(

state = rememberLazyListState(),

modifier = modifier.padding(8.dp)

) {

items(news) { new ->

Column(modifier = Modifier.padding(8.dp)) {

Text(

text = new.title,

fontWeight = FontWeight.ExtraBold,

fontSize = 16.sp,

modifier = Modifier.padding(0.dp, 10.dp)

)

Text(text = new.summary, fontSize = 12.sp)

Row(modifier = Modifier.padding(0.dp, 10.dp)) {

Text(text = new.infoSource, fontSize = 12.sp)

Text(

text = new.pubDateStr,

fontSize = 12.sp,

modifier = Modifier.padding(8.dp, 0.dp)

)

}

}

Divider(

modifier = Modifier.padding(horizontal = 8.dp),

color = colorResource(id = R.color.black).copy(alpha = 0.08f)

)

}

}

}

看起来内容比较多啊,说明一下:

Android Compose 新闻App(三)网络数据Compose UI显示加载、Room和DataStore使用,2024年程序员学习,android,ui

首先是这个LazyColumn,LazyColumn,它只会渲染界面上的可见项,因而有助于提升性能,而且无需使用 scroll 修饰符。Jetpack Compose 中的 LazyColumn 等同于 Android 视图中的 RecyclerView。这里的state就使用rememberLazyListState()。

那么这里就说完了。

Android Compose 新闻App(三)网络数据Compose UI显示加载、Room和DataStore使用,2024年程序员学习,android,ui

这个items里面就是显示数据,然后我们构建item的布局,常规的属性值就没啥好说的,这里就说一下这个Divider,这就是一个分隔线。我们增加一个左右填充,然后设置分隔线的颜色,这里用了一个black色值,就是#000000,在colors.xml中添加即可,然后设置这个颜色值的透明度,太亮了不好看。

然后你需要在setContent中添加initData()的调用

Android Compose 新闻App(三)网络数据Compose UI显示加载、Room和DataStore使用,2024年程序员学习,android,ui

下面我们运行一下:

Android Compose 新闻App(三)网络数据Compose UI显示加载、Room和DataStore使用,2024年程序员学习,android,ui

这样写代码是不是很简单呢?

五、Room使用


现在数据有了,那么为了减少接口API的访问次数,我们需要将数据存储到本地数据库中,我们可以在每天访问两次或一次接口,然后其余的访问都从数据库中去获取数据。这样是不是很好呢?这里我们使用的是Room数据库,它在Java和Kotlin中使用的方式有点点变化,总体区别不大。

① 添加依赖

要使用Room,首先是添加依赖,现在项目的build.gradle中定义好Room数据库的依赖版本:

room_version = ‘2.3.0’

Android Compose 新闻App(三)网络数据Compose UI显示加载、Room和DataStore使用,2024年程序员学习,android,ui

然后到app模块下的build.gradle中的dependencies{}闭包中去添加依赖:

//Room数据库

implementation “androidx.room:room-runtime:$room_version”

implementation “androidx.room:room-ktx:$room_version”

kapt “androidx.room:room-compiler:$room_version”

如下图所示:

Android Compose 新闻App(三)网络数据Compose UI显示加载、Room和DataStore使用,2024年程序员学习,android,ui

然后Sync Now即可,相比于Hilt来说,你会觉得Room的引入更简单了,这里的room-ktx库是是对Kotlin协程的支持。Java使用时没有这个库。

② 基础配置

下面我们来使用它,首先是实体Bean,在com.llw.goodnews包下新建db包,然后将bean包移动到db包下,打开EpidemicNews类,

Android Compose 新闻App(三)网络数据Compose UI显示加载、Room和DataStore使用,2024年程序员学习,android,ui

添加两个注解,然后我们添加接口,在db包下新建一个dao包,dao包下新建一个NewsItemDao接口,里面的代码如下:

@Dao

interface NewsItemDao {

@Query(“SELECT * FROM newsitem”)

fun getAll(): List

@Insert

fun insertAll(newsItem: List?)

@Query(“DELETE FROM newsitem”)

fun delete()

}

最后在db包下创建一个AppDatabase用于处理数据库,代码如下:

@Database(entities = [NewsItem::class], version = 1, exportSchema = false)

abstract class AppDatabase : RoomDatabase() {

abstract fun newsItemDao(): NewsItemDao

companion object {

@Volatile

private var instance: AppDatabase? = null

private const val DATABASE_NAME = “good_news.db”

fun getInstance(context: Context): AppDatabase {

return instance ?: synchronized(this) {

instance ?: Room.databaseBuilder(context, AppDatabase::class.java, DATABASE_NAME).build().also { instance = it }

}

}

}

}

这里很简单的代码,也没啥好说的,就是初始化,然后单例。下面进入到App中,如下所示配置

Android Compose 新闻App(三)网络数据Compose UI显示加载、Room和DataStore使用,2024年程序员学习,android,ui

③ 使用

这里我们存储的数据表是NewsItem,但是网络请求返回的是EpidemicNews,因此我们要改一下返回的数据,改的话就在EpidemicNewsRepository中,这里我们请求成功之后返回的是epidemicNews,如下图所示:

Android Compose 新闻App(三)网络数据Compose UI显示加载、Room和DataStore使用,2024年程序员学习,android,ui

然后我们增加两行代码:

Android Compose 新闻App(三)网络数据Compose UI显示加载、Room和DataStore使用,2024年程序员学习,android,ui

这里就是拿到数据之后保存到本地数据库中,为什么要先删除呢?因为我要保证每次拿到的数据都是当前最新的并且和网络返回的数据一样。然后我们回到MainActivity.kt中,先运行一次,保证我们的数据库中有数据保存之后,再按照如下图所示的代码去改动。

Android Compose 新闻App(三)网络数据Compose UI显示加载、Room和DataStore使用,2024年程序员学习,android,ui

这就是说当我的数据库中有数据了,那么就从本地数据库中去获取数据显示在UI上,运行一下:

Android Compose 新闻App(三)网络数据Compose UI显示加载、Room和DataStore使用,2024年程序员学习,android,ui

你会发现报错了,报错的原因就是我标注的这里,大意就是无法在主线程中访问数据库,那么也好解决,在Room上加一个配置就可以了。打开AppDatabase,如下图所示修改一下即可。

Android Compose 新闻App(三)网络数据Compose UI显示加载、Room和DataStore使用,2024年程序员学习,android,ui

下面再运行一下就可以了。不过我们依然要去解决在主线程中访问数据库的问题,这个后面再说,现在你会觉得这样切换太麻烦了,先请求一次网络,然后改一下代码再去请求数据库,这也太low了,不行,绝对不行。下面我们改一下,通过代码来解决这个问题。

六、DataStore使用


刚才的问题可以通过什么方式去解决呢?本地缓存,在Android中提到缓存,你最开始想到的就是SP(SharedPreferences),然后是腾讯的MMKV,再是DataStore,这三者是先后顺序出现的,也许你还不知道DataStore是什么,没关系,我这里也不会讲的,哈哈哈。是不是很意外。当然了你不了解可以去看看Android Jetpack组件 DataStore的使用和简单封装,看完了你就知道怎么用了,当然你也可以不用看,因为实际上我们的用法和SP差不多,都是封装成工具类来使用,在那篇文章中就是这样封装,在这里就直接拿来用。

① 添加依赖

DataStore也是Jetpack的组件,因此我们使用的话也是需要添加依赖的。首先依然是在项目的build.gradle中添加依赖版本

datastore_version = ‘1.0.0’

Android Compose 新闻App(三)网络数据Compose UI显示加载、Room和DataStore使用,2024年程序员学习,android,ui

然后是在app的build.gradle中的dependencies{}闭包中添加如下依赖:

//DataStore

implementation “androidx.datastore:datastore-preferences:$datastore_version”

implementation “androidx.datastore:datastore-preferences-core:$datastore_version”

位置如下图所示:

Android Compose 新闻App(三)网络数据Compose UI显示加载、Room和DataStore使用,2024年程序员学习,android,ui

然后Sync Now。

② 封装

首先在App中增加如下代码

Android Compose 新闻App(三)网络数据Compose UI显示加载、Room和DataStore使用,2024年程序员学习,android,ui

我们在utils包下新建一个EasyDataStore.kt,里面的代码如下:

object EasyDataStore {

// 创建DataStore

private val App.dataStore: DataStore by preferencesDataStore(name = “GoodNews”)

// DataStore变量

private val dataStore = App.instance.dataStore

/**

  • 存数据

*/

fun putData(key: String, value: T) {

runBlocking {

when (value) {

is Int -> putIntData(key, value)

is Long -> putLongData(key, value)

is String -> putStringData(key, value)

is Boolean -> putBooleanData(key, value)

is Float -> putFloatData(key, value)

is Double -> putDoubleData(key, value)

else -> throw IllegalArgumentException(“This type cannot be saved to the Data Store”)

}

}

}

/**

  • 取数据

*/

fun getData(key: String, defaultValue: T): T {

val data = when (defaultValue) {

is Int -> getIntData(key, defaultValue)

is Long -> getLongData(key, defaultValue)

is String -> getStringData(key, defaultValue)

is Boolean -> getBooleanData(key, defaultValue)

is Float -> getFloatData(key, defaultValue)

is Double -> getDoubleData(key, defaultValue)

else -> throw IllegalArgumentException(“This type cannot be saved to the Data Store”)

}

return data as T

}

/**

  • 存放Int数据

*/

private suspend fun putIntData(key: String, value: Int) = dataStore.edit {

it[intPreferencesKey(key)] = value

}

/**

  • 存放Long数据

*/

private suspend fun putLongData(key: String, value: Long) = dataStore.edit {

it[longPreferencesKey(key)] = value

}

/**

  • 存放String数据

*/

private suspend fun putStringData(key: String, value: String) = dataStore.edit {

it[stringPreferencesKey(key)] = value

}

/**

  • 存放Boolean数据

*/

private suspend fun putBooleanData(key: String, value: Boolean) = dataStore.edit {

it[booleanPreferencesKey(key)] = value

}

/**

  • 存放Float数据

*/

private suspend fun putFloatData(key: String, value: Float) = dataStore.edit {

it[floatPreferencesKey(key)] = value

}

/**

  • 存放Double数据

*/

private suspend fun putDoubleData(key: String, value: Double) = dataStore.edit {

it[doublePreferencesKey(key)] = value

}

/**

  • 取出Int数据

*/

private fun getIntData(key: String, default: Int = 0): Int = runBlocking {

return@runBlocking dataStore.data.map {

it[intPreferencesKey(key)] ?: default

}.first()

}

/**

  • 取出Long数据

*/

private fun getLongData(key: String, default: Long = 0): Long = runBlocking {

return@runBlocking dataStore.data.map {

it[longPreferencesKey(key)] ?: default

}.first()

}

/**

  • 取出String数据

*/

private fun getStringData(key: String, default: String? = null): String = runBlocking {

return@runBlocking dataStore.data.map {

it[stringPreferencesKey(key)] ?: default

}.first()!!

}

/**

  • 取出Boolean数据

*/

private fun getBooleanData(key: String, default: Boolean = false): Boolean = runBlocking {

return@runBlocking dataStore.data.map {

it[booleanPreferencesKey(key)] ?: default

}.first()

}

/**

  • 取出Float数据

*/

private fun getFloatData(key: String, default: Float = 0.0f): Float = runBlocking {

return@runBlocking dataStore.data.map {

it[floatPreferencesKey(key)] ?: default

}.first()

}

/**

  • 取出Double数据

*/

private fun getDoubleData(key: String, default: Double = 0.00): Double = runBlocking {

return@runBlocking dataStore.data.map {

it[doublePreferencesKey(key)] ?: default

}.first()

}

}

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
Android Compose 新闻App(三)网络数据Compose UI显示加载、Room和DataStore使用,2024年程序员学习,android,ui
Android Compose 新闻App(三)网络数据Compose UI显示加载、Room和DataStore使用,2024年程序员学习,android,ui
Android Compose 新闻App(三)网络数据Compose UI显示加载、Room和DataStore使用,2024年程序员学习,android,ui
Android Compose 新闻App(三)网络数据Compose UI显示加载、Room和DataStore使用,2024年程序员学习,android,ui
Android Compose 新闻App(三)网络数据Compose UI显示加载、Room和DataStore使用,2024年程序员学习,android,ui
Android Compose 新闻App(三)网络数据Compose UI显示加载、Room和DataStore使用,2024年程序员学习,android,ui
Android Compose 新闻App(三)网络数据Compose UI显示加载、Room和DataStore使用,2024年程序员学习,android,ui

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
Android Compose 新闻App(三)网络数据Compose UI显示加载、Room和DataStore使用,2024年程序员学习,android,ui

最后

今天关于面试的分享就到这里,还是那句话,有些东西你不仅要懂,而且要能够很好地表达出来,能够让面试官认可你的理解,例如Handler机制,这个是面试必问之题。有些晦涩的点,或许它只活在面试当中,实际工作当中你压根不会用到它,但是你要知道它是什么东西。

最后在这里小编分享一份自己收录整理上述技术体系图相关的几十套腾讯、头条、阿里、美团等公司19年的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。

还有 高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。

【Android核心高级技术PDF文档,BAT大厂面试真题解析】

Android Compose 新闻App(三)网络数据Compose UI显示加载、Room和DataStore使用,2024年程序员学习,android,ui

【算法合集】

Android Compose 新闻App(三)网络数据Compose UI显示加载、Room和DataStore使用,2024年程序员学习,android,ui

【延伸Android必备知识点】

Android Compose 新闻App(三)网络数据Compose UI显示加载、Room和DataStore使用,2024年程序员学习,android,ui

【Android部分高级架构视频学习资源】

**Android精讲视频领取学习后更加是如虎添翼!**进军BATJ大厂等(备战)!现在都说互联网寒冬,其实无非就是你上错了车,且穿的少(技能),要是你上对车,自身技术能力够强,公司换掉的代价大,怎么可能会被裁掉,都是淘汰末端的业务Curd而已!现如今市场上初级程序员泛滥,这套教程针对Android开发工程师1-6年的人员、正处于瓶颈期,想要年后突破自己涨薪的,进阶Android中高级、架构师对你更是如鱼得水,赶快领取吧!

671413)]
[外链图片转存中…(img-VBnBt0lV-1712063671414)]
[外链图片转存中…(img-POROWuOg-1712063671414)]
[外链图片转存中…(img-hxnakGze-1712063671414)]
Android Compose 新闻App(三)网络数据Compose UI显示加载、Room和DataStore使用,2024年程序员学习,android,ui

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
[外链图片转存中…(img-n4ftnFsb-1712063671415)]

最后

今天关于面试的分享就到这里,还是那句话,有些东西你不仅要懂,而且要能够很好地表达出来,能够让面试官认可你的理解,例如Handler机制,这个是面试必问之题。有些晦涩的点,或许它只活在面试当中,实际工作当中你压根不会用到它,但是你要知道它是什么东西。

最后在这里小编分享一份自己收录整理上述技术体系图相关的几十套腾讯、头条、阿里、美团等公司19年的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。

还有 高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。

【Android核心高级技术PDF文档,BAT大厂面试真题解析】

[外链图片转存中…(img-towVqTgM-1712063671415)]

【算法合集】

[外链图片转存中…(img-yNeEhL40-1712063671415)]

【延伸Android必备知识点】

[外链图片转存中…(img-PnZM7z60-1712063671416)]

【Android部分高级架构视频学习资源】

**Android精讲视频领取学习后更加是如虎添翼!**进军BATJ大厂等(备战)!现在都说互联网寒冬,其实无非就是你上错了车,且穿的少(技能),要是你上对车,自身技术能力够强,公司换掉的代价大,怎么可能会被裁掉,都是淘汰末端的业务Curd而已!现如今市场上初级程序员泛滥,这套教程针对Android开发工程师1-6年的人员、正处于瓶颈期,想要年后突破自己涨薪的,进阶Android中高级、架构师对你更是如鱼得水,赶快领取吧!

本文已被CODING开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》收录文章来源地址https://www.toymoban.com/news/detail-845420.html

到了这里,关于Android Compose 新闻App(三)网络数据Compose UI显示加载、Room和DataStore使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android笔记(二十三):Paging3分页加载库结合Compose的实现分层数据源访问

    在Android笔记(二十二):Paging3分页加载库结合Compose的实现网络单一数据源访问一文中,实现了单一数据源的访问。在实际运行中,往往希望不是单纯地访问网络数据,更希望将访问的网络数据保存到移动终端的SQLite数据库中,使得移动应用在离线的状态下也可以从数据库中

    2024年01月16日
    浏览(39)
  • Android期末项目 新闻APP的设计与实现

    1 项目基本信息 1.1 项目名称 好好学习新闻APP的设计与实现 1.2 开发运行环境 Android Studio 2022 Android SDK 7.0 SQLite 5.4.1 Gradle 7.5 JDK 1.8.0 虚拟机 Pixel 2 API 30 2 1.3 使用的核心类及组件 Activity:Android系统中的四大组件之一,它是一种应用程序组件,用于提供用户交互界面和对用户输入

    2024年02月05日
    浏览(40)
  • 基于android校园新闻APP开发的设计与实现

    目 录 摘 要 I Abstract II 第一章 绪论 1 1.1 研究背景 1 1.2 研究意义 1 1.3研究现状 1 1.4设计思路及内容 2 第二章 系统开发环境及相关技术 3 2.1开发环境 3 2.2 Java SDK 3 2.3 Eclipse 3 2.4 ADT 3 2.5 Android SDK 4 2.6 JSP技术 7 2.7 JSON 8 2.8JDBC技术 8 第三章 系统分析 9 3.1 研究目标 9 3.2 需求分析 9 3

    2024年02月09日
    浏览(44)
  • element UI级联选择器---动态加载数据,动态控制二级面板的显示与隐藏

     一级数据列表是在页面初始化的时候调用接口返回的数据; 二级数据列表需要在获取到一级数据id的时候调用接口得到数据进行列表渲染; 问题: 使用了el-cascader后发现如果第一次点击父级A获取到二级数据,并且二级面板显示,第二次点击父级B获取到二级数据为[ ],此时

    2024年02月08日
    浏览(42)
  • 案例:新闻数据加载

    本篇Codelab是基于ArkTS的声明式开发范式实现的样例,主要介绍了数据请求和touch事件的使用。包含以下功能: 数据请求。 列表下拉刷新。 列表上拉加载。 List组件:列表包含一系列相同宽度的列表项。 Tabs:通过页签进行内容视图切换。 TabContent:仅在Tabs中使用,对应一个切

    2024年01月19日
    浏览(44)
  • vue中数据滚动显示 实现Element-UI中el-table内数据的懒加载

    工作中我们经常会用到element-ui组件库中的le-table组件来展示数据,但当table的数据源数量过大的时候统一展示可能会出现页面卡顿,且会影响用户体验,为此我们可以尝试对el-table中的数据做懒加载的效果展示: 1. 挂在阶段监听el-table的scroll滚动事件 2. 当table表格滚动条的位置

    2023年04月08日
    浏览(57)
  • 基于Android Studio编辑器上开发的一款看点新闻App

    完整资料进入【数字空间】查看——baidu搜索\\\"writebug\\\" 1 系统需求分析 1.1 引言 1.1.1 开发目的 看点新闻App的开发是为了实时查看最新消息以了解社会动态,增长知识,增广见闻,顺便娱乐一下内心世界来放松自己。 1.1.2 开发背景 随着新媒体的崛起,纸媒遭受到重大打击,纸媒

    2024年02月16日
    浏览(38)
  • Android 天气APP(二十二)改动些许UI、增加更多空气质量数据和生活建议数据展示

    android:background=“@mipmap/icon_100” android:layout_width=“30dp” android:layout_height=“30dp”/ LinearLayout android:gravity=“right” android:layout_width=“@dimen/dp_0” android:layout_height=“wrap_content” android:layout_weight=“1” TextView android:id=“@+id/tv_temp_height” android:textSize=“@dimen/sp_14” android:textColor=“

    2024年04月09日
    浏览(54)
  • Android应用:实现网络加载商品数据【OKHttp、Glide、Gson】

    实现网络加载商品数据的功能: 1、在AndroidManifest.xml中声明网络权限; 2、在app/build.gradle中添加okhttp, glide, gson等必需的第3方库; 3、在MainActivity中通过OkHttpClient连接给定的Web服务,获取商品数据;对应的json数据为本地的json文件,名字为goods_list_data.json;数据内容为:[ {“id”

    2024年02月08日
    浏览(58)
  • Android Compose——一个简单的Bilibili APP

    此Demo采用Android Compose声明式UI编写而成,主体采用MVVM设计框架,Demo涉及到的主要技术包括:Flow、Coroutines、Retrofit、Okhttp、Hilt以及适配了深色模式等;主要数据来源于Bilibili API。 Demo中所使用的依赖如下表格所示 库名称 备注 Flow 流 Coroutines 协程 Retrofit 网络 Okhttp 网络 Hilt 依

    2023年04月08日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包