Возврат значения из AsyncTask в Kotlin - PullRequest
0 голосов
/ 01 мая 2019

Я создаю приложение для Android, которое следует шаблону MVVM, используя Room и LiveData, но мне нужно вернуть идентификатор последней вставки в одну таблицу, потому что она используется для добавления значений в другую таблицу, где идентификатор является внешним ключом Я знаю, что могу добиться этого, вернув его из DAO:

@Dao
interface TratamientoDao {
    @Insert
    fun insert(tratamiento : Tratamiento): Long
}

Но проблема в том, что мне нужно вернуть значение из AsyncTask, который вставляет новую запись, я попробовал подход, объясненный в этом вопросе: Как получить результат OnPostExecute () для основной деятельности, потому что AsyncTask отдельный класс?

Но в моем случае метод processFinish никогда не вызывается.

Это мой код:

interface AsyncValue{
    fun processFinish(lastID: Long?) : Long?
}

class TratamientoRepository (application: Application): AsyncValue {

    val tratamientoDao : TratamientoDao

    init{
        val database = MMRDataBase.getInstance(application)
        tratamientoDao = database.tratamientoDao()
    }

    fun insert(tratamiento: Tratamiento) : Long? {
        InsertTratamientoAsyncTask(tratamientoDao).execute(tratamiento)
        return 45
    }

    override fun processFinish(lastID: Long?): Long? {
        Log.d("ValorIngresado:", lastID.toString())
        return lastID
    }


    private class InsertTratamientoAsyncTask constructor(private val tratamientoDao: TratamientoDao) : AsyncTask<Tratamiento, Void, Long>(){

        var  completionCode : AsyncValue? = null
        override fun doInBackground(vararg params: Tratamiento): Long?{

            return tratamientoDao.insert(params[0])
        }

        override fun onPostExecute(result: Long?) {
           completionCode?.processFinish(result)
            //Log.i("TAMANO", result.toString())

        }

    }

}

Итак, как я могу вернуть значение из AsyncTask в Kotlin?

Ответы [ 3 ]

1 голос
/ 02 мая 2019

Это способ вернуть значение из AsyncTask, которое вы можете преобразовать в Kotlin и попробовать это

public class MyClass extends Activity {

 private class myTask extends AsyncTask<Void, Void, String> { 

    protected Void doInBackground(String... params) { 
      //do stuff return results; 
    } 

   @Override protected void onPostExecute(String result) { 
     //do stuff 
     myMethod(myValue); 
   } 
 }

 private myValueType myMethod(String myValue) { 
   //handle value 
   return myValueType; 
 } 
}
0 голосов
/ 02 мая 2019

Лучший способ справиться с AyncTask в Kotlin - это использовать библиотеку Anko для выполнения фоновых задач.Это сильно упрощает его использование.Просто так:

doAsync {
    var result = runLongTask()
    uiThread {
        toast(result)
    }
}

Для получения дополнительной информации проверьте эту статью:

https://antonioleiva.com/anko-background-kotlin-android/

0 голосов
/ 02 мая 2019

Возможно, есть способ, но я предпочитаю использовать сопрограммы. Как например:

val tratamiento = GetTratamiento()//or whatever you do to get the object
var result = 0
var scope = CoroutineScope(Job() + Dispatchers.IO)
scope.launch {
  result = tratamientoDao.insert(tratamiento)
}

Не забудьте добавить сопрограммы в приложение build.gradle

implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:0.27.0-eap13"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...