mirror of
https://github.com/Matte23/circolapp.git
synced 2025-12-06 07:29:10 +00:00
Use coroutines instead of threads
This commit is contained in:
@@ -19,6 +19,8 @@
|
|||||||
package net.underdesk.circolapp.server
|
package net.underdesk.circolapp.server
|
||||||
|
|
||||||
import com.google.gson.Gson
|
import com.google.gson.Gson
|
||||||
|
import kotlinx.coroutines.Dispatchers
|
||||||
|
import kotlinx.coroutines.withContext
|
||||||
import net.underdesk.circolapp.data.Circular
|
import net.underdesk.circolapp.data.Circular
|
||||||
import net.underdesk.circolapp.server.pojo.Response
|
import net.underdesk.circolapp.server.pojo.Response
|
||||||
import org.jsoup.Jsoup
|
import org.jsoup.Jsoup
|
||||||
@@ -34,7 +36,8 @@ class DataFetcher {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Throws(IOException::class)
|
@Throws(IOException::class)
|
||||||
fun getCircularsFromServer(): List<Circular> {
|
suspend fun getCircularsFromServer(): List<Circular> {
|
||||||
|
return withContext(Dispatchers.Default) {
|
||||||
val json = gson.fromJson(retrieveDataFromServer(), Response::class.java)
|
val json = gson.fromJson(retrieveDataFromServer(), Response::class.java)
|
||||||
|
|
||||||
val document = Jsoup.parseBodyFragment(json.content!!.rendered)
|
val document = Jsoup.parseBodyFragment(json.content!!.rendered)
|
||||||
@@ -51,13 +54,16 @@ class DataFetcher {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return list
|
list
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Throws(IOException::class)
|
@Throws(IOException::class)
|
||||||
fun retrieveDataFromServer(): String? {
|
private suspend fun retrieveDataFromServer(): String? {
|
||||||
var connection: HttpsURLConnection? = null
|
var connection: HttpsURLConnection? = null
|
||||||
return try {
|
|
||||||
|
return withContext(Dispatchers.IO) {
|
||||||
|
try {
|
||||||
connection = (URL(ENDPOINT_URL).openConnection() as? HttpsURLConnection)
|
connection = (URL(ENDPOINT_URL).openConnection() as? HttpsURLConnection)
|
||||||
connection?.run {
|
connection?.run {
|
||||||
// Set GET HTTP method
|
// Set GET HTTP method
|
||||||
@@ -77,6 +83,6 @@ class DataFetcher {
|
|||||||
connection?.inputStream?.close()
|
connection?.inputStream?.close()
|
||||||
connection?.disconnect()
|
connection?.disconnect()
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -19,10 +19,8 @@
|
|||||||
package net.underdesk.circolapp.viewmodels
|
package net.underdesk.circolapp.viewmodels
|
||||||
|
|
||||||
import android.app.Application
|
import android.app.Application
|
||||||
import androidx.lifecycle.AndroidViewModel
|
import androidx.lifecycle.*
|
||||||
import androidx.lifecycle.LiveData
|
import kotlinx.coroutines.launch
|
||||||
import androidx.lifecycle.MutableLiveData
|
|
||||||
import androidx.lifecycle.Transformations
|
|
||||||
import net.underdesk.circolapp.data.AppDatabase
|
import net.underdesk.circolapp.data.AppDatabase
|
||||||
import net.underdesk.circolapp.data.Circular
|
import net.underdesk.circolapp.data.Circular
|
||||||
import net.underdesk.circolapp.server.DataFetcher
|
import net.underdesk.circolapp.server.DataFetcher
|
||||||
@@ -48,8 +46,7 @@ class CircularLetterViewModel(application: Application) : AndroidViewModel(appli
|
|||||||
|
|
||||||
fun updateCirculars() {
|
fun updateCirculars() {
|
||||||
if (isNotUpdating) {
|
if (isNotUpdating) {
|
||||||
object : Thread() {
|
viewModelScope.launch {
|
||||||
override fun run() {
|
|
||||||
isNotUpdating = false
|
isNotUpdating = false
|
||||||
val fetcher = DataFetcher()
|
val fetcher = DataFetcher()
|
||||||
|
|
||||||
@@ -66,7 +63,6 @@ class CircularLetterViewModel(application: Application) : AndroidViewModel(appli
|
|||||||
circularsUpdated.postValue(true)
|
circularsUpdated.postValue(true)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}.start()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -30,6 +30,9 @@ import androidx.core.app.NotificationManagerCompat
|
|||||||
import androidx.core.app.TaskStackBuilder
|
import androidx.core.app.TaskStackBuilder
|
||||||
import androidx.preference.PreferenceManager
|
import androidx.preference.PreferenceManager
|
||||||
import androidx.work.*
|
import androidx.work.*
|
||||||
|
import kotlinx.coroutines.Dispatchers
|
||||||
|
import kotlinx.coroutines.coroutineScope
|
||||||
|
import kotlinx.coroutines.withContext
|
||||||
import net.underdesk.circolapp.MainActivity
|
import net.underdesk.circolapp.MainActivity
|
||||||
import net.underdesk.circolapp.R
|
import net.underdesk.circolapp.R
|
||||||
import net.underdesk.circolapp.data.AppDatabase
|
import net.underdesk.circolapp.data.AppDatabase
|
||||||
@@ -40,7 +43,7 @@ import java.util.concurrent.TimeUnit
|
|||||||
|
|
||||||
|
|
||||||
class PollWork(appContext: Context, workerParams: WorkerParameters) :
|
class PollWork(appContext: Context, workerParams: WorkerParameters) :
|
||||||
Worker(appContext, workerParams) {
|
CoroutineWorker(appContext, workerParams) {
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
const val CHANNEL_ID = "net.underdesk.circolapp.NEW_CIRCULAR"
|
const val CHANNEL_ID = "net.underdesk.circolapp.NEW_CIRCULAR"
|
||||||
@@ -84,17 +87,20 @@ class PollWork(appContext: Context, workerParams: WorkerParameters) :
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun doWork(): Result {
|
override suspend fun doWork(): Result = coroutineScope {
|
||||||
val fetcher = DataFetcher()
|
val fetcher = DataFetcher()
|
||||||
|
|
||||||
val oldCirculars = AppDatabase.getInstance(applicationContext).circularDao().getCirculars()
|
withContext(Dispatchers.IO) {
|
||||||
|
val oldCirculars =
|
||||||
|
AppDatabase.getInstance(applicationContext).circularDao().getCirculars()
|
||||||
val newCirculars = try {
|
val newCirculars = try {
|
||||||
fetcher.getCircularsFromServer()
|
fetcher.getCircularsFromServer()
|
||||||
} catch (exception: IOException) {
|
} catch (exception: IOException) {
|
||||||
return Result.retry()
|
return@withContext Result.retry()
|
||||||
}
|
}
|
||||||
|
|
||||||
if (newCirculars.size != oldCirculars.size) {
|
if (newCirculars.size != oldCirculars.size) {
|
||||||
|
withContext(Dispatchers.Main) {
|
||||||
createNotificationChannel()
|
createNotificationChannel()
|
||||||
|
|
||||||
val summaryStyle = NotificationCompat.InboxStyle()
|
val summaryStyle = NotificationCompat.InboxStyle()
|
||||||
@@ -108,7 +114,8 @@ class PollWork(appContext: Context, workerParams: WorkerParameters) :
|
|||||||
summaryStyle.addLine(newCirculars[i].name)
|
summaryStyle.addLine(newCirculars[i].name)
|
||||||
}
|
}
|
||||||
|
|
||||||
val summaryNotification = NotificationCompat.Builder(applicationContext, CHANNEL_ID)
|
val summaryNotification =
|
||||||
|
NotificationCompat.Builder(applicationContext, CHANNEL_ID)
|
||||||
.setContentTitle(applicationContext.getString(R.string.notification_summary_title))
|
.setContentTitle(applicationContext.getString(R.string.notification_summary_title))
|
||||||
.setContentText(
|
.setContentText(
|
||||||
applicationContext.resources.getQuantityString(
|
applicationContext.resources.getQuantityString(
|
||||||
@@ -126,10 +133,13 @@ class PollWork(appContext: Context, workerParams: WorkerParameters) :
|
|||||||
with(NotificationManagerCompat.from(applicationContext)) {
|
with(NotificationManagerCompat.from(applicationContext)) {
|
||||||
notify(-1, summaryNotification)
|
notify(-1, summaryNotification)
|
||||||
}
|
}
|
||||||
|
|
||||||
AppDatabase.getInstance(applicationContext).circularDao().insertAll(newCirculars)
|
|
||||||
}
|
}
|
||||||
return Result.success()
|
|
||||||
|
AppDatabase.getInstance(applicationContext).circularDao()
|
||||||
|
.insertAll(newCirculars)
|
||||||
|
}
|
||||||
|
Result.success()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun createNotification(circular: Circular) {
|
private fun createNotification(circular: Circular) {
|
||||||
|
|||||||
Reference in New Issue
Block a user