Use coroutines instead of threads

This commit is contained in:
2020-09-01 21:13:08 +02:00
committed by Matte23
parent c96ab593b0
commit c47ee95780
3 changed files with 102 additions and 90 deletions

View File

@@ -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()
}
}
}
}

View File

@@ -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()
}
}
}

View File

@@ -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) {