Skip to content

Commit 3c39cbb

Browse files
committed
update
1 parent 137138b commit 3c39cbb

File tree

7 files changed

+120
-17
lines changed

7 files changed

+120
-17
lines changed

app/src/main/AndroidManifest.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
33

4+
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
45
<uses-permission android:name="android.permission.INTERNET" />
56

67
<application

app/src/main/java/com/wzq/jd/compose/app/App.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package com.wzq.jd.compose.app
33
import android.annotation.SuppressLint
44
import android.app.Application
55
import android.content.Context
6-
import com.wzq.jd.compose.app.data.local.AppDatabase
76

87
/**
98
* create by wzq on 2023/12/20
@@ -16,12 +15,13 @@ class App : Application() {
1615
private var _context: Context? = null
1716

1817
val context: Context get() = _context!!
18+
1919
}
2020

2121
override fun onCreate() {
2222
super.onCreate()
23-
_context = this
23+
_context = this.applicationContext
2424

25-
AppDatabase.instance
25+
AppContainer.preInit()
2626
}
2727
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package com.wzq.jd.compose.app
2+
3+
import androidx.room.Room
4+
import com.wzq.jd.compose.app.data.local.AppDatabase
5+
6+
/**
7+
* create by wzq on 2023/12/28
8+
*
9+
*/
10+
object AppContainer {
11+
12+
val networkMonitor by lazy {
13+
ConnectivityManagerNetworkMonitor(App.context)
14+
}
15+
16+
val database by lazy {
17+
Room.databaseBuilder(App.context, AppDatabase::class.java, "database-j")
18+
.fallbackToDestructiveMigration()
19+
.build()
20+
}
21+
22+
private var initialized = false
23+
fun preInit(){
24+
if (initialized) {
25+
return
26+
}
27+
networkMonitor
28+
database
29+
initialized = true
30+
}
31+
}
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
package com.wzq.jd.compose.app
2+
3+
import android.content.Context
4+
import android.net.ConnectivityManager
5+
import android.net.ConnectivityManager.NetworkCallback
6+
import android.net.Network
7+
import android.net.NetworkCapabilities
8+
import android.net.NetworkRequest
9+
import android.net.NetworkRequest.Builder
10+
import android.os.Build.VERSION
11+
import android.os.Build.VERSION_CODES
12+
import androidx.core.content.getSystemService
13+
import kotlinx.coroutines.channels.awaitClose
14+
import kotlinx.coroutines.flow.Flow
15+
import kotlinx.coroutines.flow.callbackFlow
16+
import kotlinx.coroutines.flow.conflate
17+
18+
interface NetworkMonitor {
19+
val isOnline: Flow<Boolean>
20+
}
21+
22+
class ConnectivityManagerNetworkMonitor(
23+
private val context: Context,
24+
) : NetworkMonitor {
25+
override val isOnline: Flow<Boolean> = callbackFlow {
26+
val connectivityManager = context.getSystemService<ConnectivityManager>()
27+
if (connectivityManager == null) {
28+
channel.trySend(false)
29+
channel.close()
30+
return@callbackFlow
31+
}
32+
33+
/**
34+
* The callback's methods are invoked on changes to *any* network matching the [NetworkRequest],
35+
* not just the active network. So we can simply track the presence (or absence) of such [Network].
36+
*/
37+
val callback = object : NetworkCallback() {
38+
39+
private val networks = mutableSetOf<Network>()
40+
41+
override fun onAvailable(network: Network) {
42+
networks += network
43+
channel.trySend(true)
44+
}
45+
46+
override fun onLost(network: Network) {
47+
networks -= network
48+
channel.trySend(networks.isNotEmpty())
49+
}
50+
}
51+
52+
val request = Builder()
53+
.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
54+
.build()
55+
connectivityManager.registerNetworkCallback(request, callback)
56+
57+
/**
58+
* Sends the latest connectivity status to the underlying channel.
59+
*/
60+
channel.trySend(connectivityManager.isCurrentlyConnected())
61+
62+
awaitClose {
63+
connectivityManager.unregisterNetworkCallback(callback)
64+
}
65+
}
66+
.conflate()
67+
68+
@Suppress("DEPRECATION")
69+
private fun ConnectivityManager.isCurrentlyConnected() = when {
70+
VERSION.SDK_INT >= VERSION_CODES.M ->
71+
activeNetwork
72+
?.let(::getNetworkCapabilities)
73+
?.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
74+
75+
else -> activeNetworkInfo?.isConnected
76+
} ?: false
77+
}
Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
package com.wzq.jd.compose.app.data.local
22

33
import androidx.room.Database
4-
import androidx.room.Room
54
import androidx.room.RoomDatabase
6-
import com.wzq.jd.compose.app.App
75
import com.wzq.jd.compose.app.data.model.ArticleItem
86
import com.wzq.jd.compose.app.data.model.Categories
97

@@ -15,12 +13,4 @@ import com.wzq.jd.compose.app.data.model.Categories
1513
abstract class AppDatabase : RoomDatabase() {
1614
abstract fun articleDao(): ArticleDao
1715
abstract fun categoriesDao(): CategoriesDao
18-
19-
companion object{
20-
val instance by lazy {
21-
Room.databaseBuilder(App.context, AppDatabase::class.java, "database-j")
22-
.fallbackToDestructiveMigration()
23-
.build()
24-
}
25-
}
2616
}

app/src/main/java/com/wzq/jd/compose/app/page/categories/CategoriesViewModel.kt

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ import androidx.compose.runtime.mutableStateMapOf
44
import androidx.lifecycle.SavedStateHandle
55
import androidx.lifecycle.ViewModel
66
import androidx.lifecycle.viewModelScope
7+
import com.wzq.jd.compose.app.AppContainer
78
import com.wzq.jd.compose.app.data.DataRepos
8-
import com.wzq.jd.compose.app.data.local.AppDatabase
99
import com.wzq.jd.compose.app.data.model.ArticleItem
1010
import com.wzq.jd.compose.app.data.model.Categories
1111
import kotlinx.coroutines.launch
@@ -20,7 +20,11 @@ class CategoriesViewModel(savedStateHandle: SavedStateHandle) : ViewModel() {
2020

2121
val pagerData = mutableStateMapOf<Int, List<ArticleItem>>()
2222

23-
private val articleDao = AppDatabase.instance.articleDao()
23+
private val articleDao = AppContainer.database.articleDao()
24+
25+
init {
26+
println("cate vm be create ")
27+
}
2428

2529
fun getItemList(index: Int) {
2630
viewModelScope.launch {

app/src/main/java/com/wzq/jd/compose/app/page/home/HomeViewModel.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,10 @@ import androidx.lifecycle.viewModelScope
66
import androidx.paging.Pager
77
import androidx.paging.PagingConfig
88
import androidx.paging.cachedIn
9+
import com.wzq.jd.compose.app.AppContainer
910
import com.wzq.jd.compose.app.data.ArticlePageSource
1011
import com.wzq.jd.compose.app.data.DataRepos
1112
import com.wzq.jd.compose.app.data.ProjectPageSource
12-
import com.wzq.jd.compose.app.data.local.AppDatabase
1313
import com.wzq.jd.compose.app.data.model.Categories
1414
import kotlinx.coroutines.launch
1515

@@ -21,7 +21,7 @@ class HomeViewModel : ViewModel() {
2121

2222
val categories = mutableStateListOf<Categories>()
2323

24-
private val categoriesDao = AppDatabase.instance.categoriesDao()
24+
private val categoriesDao = AppContainer.database.categoriesDao()
2525

2626
val articleList = Pager(PagingConfig(20), 0) {
2727
ArticlePageSource()

0 commit comments

Comments
 (0)