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
|
||||
|
||||
import com.google.gson.Gson
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.withContext
|
||||
import net.underdesk.circolapp.data.Circular
|
||||
import net.underdesk.circolapp.server.pojo.Response
|
||||
import org.jsoup.Jsoup
|
||||
@@ -34,7 +36,8 @@ class DataFetcher {
|
||||
}
|
||||
|
||||
@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 document = Jsoup.parseBodyFragment(json.content!!.rendered)
|
||||
@@ -51,13 +54,16 @@ class DataFetcher {
|
||||
}
|
||||
}
|
||||
|
||||
return list
|
||||
list
|
||||
}
|
||||
}
|
||||
|
||||
@Throws(IOException::class)
|
||||
fun retrieveDataFromServer(): String? {
|
||||
private suspend fun retrieveDataFromServer(): String? {
|
||||
var connection: HttpsURLConnection? = null
|
||||
return try {
|
||||
|
||||
return withContext(Dispatchers.IO) {
|
||||
try {
|
||||
connection = (URL(ENDPOINT_URL).openConnection() as? HttpsURLConnection)
|
||||
connection?.run {
|
||||
// Set GET HTTP method
|
||||
@@ -77,6 +83,6 @@ class DataFetcher {
|
||||
connection?.inputStream?.close()
|
||||
connection?.disconnect()
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -19,10 +19,8 @@
|
||||
package net.underdesk.circolapp.viewmodels
|
||||
|
||||
import android.app.Application
|
||||
import androidx.lifecycle.AndroidViewModel
|
||||
import androidx.lifecycle.LiveData
|
||||
import androidx.lifecycle.MutableLiveData
|
||||
import androidx.lifecycle.Transformations
|
||||
import androidx.lifecycle.*
|
||||
import kotlinx.coroutines.launch
|
||||
import net.underdesk.circolapp.data.AppDatabase
|
||||
import net.underdesk.circolapp.data.Circular
|
||||
import net.underdesk.circolapp.server.DataFetcher
|
||||
@@ -48,8 +46,7 @@ class CircularLetterViewModel(application: Application) : AndroidViewModel(appli
|
||||
|
||||
fun updateCirculars() {
|
||||
if (isNotUpdating) {
|
||||
object : Thread() {
|
||||
override fun run() {
|
||||
viewModelScope.launch {
|
||||
isNotUpdating = false
|
||||
val fetcher = DataFetcher()
|
||||
|
||||
@@ -66,7 +63,6 @@ class CircularLetterViewModel(application: Application) : AndroidViewModel(appli
|
||||
circularsUpdated.postValue(true)
|
||||
}
|
||||
}
|
||||
}.start()
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -30,6 +30,9 @@ import androidx.core.app.NotificationManagerCompat
|
||||
import androidx.core.app.TaskStackBuilder
|
||||
import androidx.preference.PreferenceManager
|
||||
import androidx.work.*
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.coroutineScope
|
||||
import kotlinx.coroutines.withContext
|
||||
import net.underdesk.circolapp.MainActivity
|
||||
import net.underdesk.circolapp.R
|
||||
import net.underdesk.circolapp.data.AppDatabase
|
||||
@@ -40,7 +43,7 @@ import java.util.concurrent.TimeUnit
|
||||
|
||||
|
||||
class PollWork(appContext: Context, workerParams: WorkerParameters) :
|
||||
Worker(appContext, workerParams) {
|
||||
CoroutineWorker(appContext, workerParams) {
|
||||
|
||||
companion object {
|
||||
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 oldCirculars = AppDatabase.getInstance(applicationContext).circularDao().getCirculars()
|
||||
withContext(Dispatchers.IO) {
|
||||
val oldCirculars =
|
||||
AppDatabase.getInstance(applicationContext).circularDao().getCirculars()
|
||||
val newCirculars = try {
|
||||
fetcher.getCircularsFromServer()
|
||||
} catch (exception: IOException) {
|
||||
return Result.retry()
|
||||
return@withContext Result.retry()
|
||||
}
|
||||
|
||||
if (newCirculars.size != oldCirculars.size) {
|
||||
withContext(Dispatchers.Main) {
|
||||
createNotificationChannel()
|
||||
|
||||
val summaryStyle = NotificationCompat.InboxStyle()
|
||||
@@ -108,7 +114,8 @@ class PollWork(appContext: Context, workerParams: WorkerParameters) :
|
||||
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))
|
||||
.setContentText(
|
||||
applicationContext.resources.getQuantityString(
|
||||
@@ -126,10 +133,13 @@ class PollWork(appContext: Context, workerParams: WorkerParameters) :
|
||||
with(NotificationManagerCompat.from(applicationContext)) {
|
||||
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) {
|
||||
|
||||
Reference in New Issue
Block a user