Как изменить переменную экземпляра из отдельной AsyncTask

скажем, у меня есть действие с переменной экземпляра loadedMovie и метод, который выполняет AsyncTask, который находится в другом файле

class MainActivity:AppCompatActivity(), NavigationView.OnNavigationItemSelectedListener {

 var loadedMovie: Movie? = null

 ....

 fun loadMovie() {
   val task = LoadMovieTask(this)

   task.execute()
 }
}

отдельная AsyncTask

class LoadMovieTask(val ctx: Activity) : AsyncTask<Void, Void, Void>() {

  var movie: Movie? = null

  override fun onPreExecute() {
    ....
  }

  // loading information from network
  override fun doInBackground(vararg params: Void?): Void? {
    movie = load()

    return null
  }

  // here i modify views with help of kotlin android extensions
  override fun onPostExecute(result: Void?) {
    ....
  }
}

проблема в том, что я почему-то не могу изменить loadedMovie ни из doInBackground (что нормально, потому что он работает в отдельном потоке), ни из onPostExecute (что не нормально)

я просто набираю ctx.loadedMovie в onPostExecute, и его там нет.. может я чего-то не понимаю? или, может быть, есть другой способ сделать это, о котором я не знаю


person pink_plus_purple    schedule 08.06.2017    source источник
comment
stackoverflow.com/questions/12575068/   -  person Raghunandan    schedule 08.06.2017
comment
Вы должны использовать слабую ссылку для удержания активности в асинхронной задаче, иначе может произойти утечка памяти.   -  person Akshay Bhat 'AB'    schedule 08.06.2017
comment
как сделать слабую ссылку?   -  person pink_plus_purple    schedule 08.06.2017
comment
слабые ссылки хорошо документированы для JVM и Java, и вся эта документация применима к Kotlin. Это не ваша главная проблема, хотя, как вы просили.   -  person Jayson Minard    schedule 08.06.2017


Ответы (1)


Использовать этот

class LoadMovieTask(val ctx: MainActivity)

вместо

class LoadMovieTask(val ctx: Activity)

MainActivity имеет метод, а не сам класс Android Activity. Таким образом, даже если вам нужен контекст, поскольку вы пытаетесь получить доступ к методу, специфичному для MainActivity, необходимо передать это

person Arun Shankar    schedule 08.06.2017
comment
Было бы полезно автору и будущим читателям вопроса, если бы вы объяснили, почему это изменение необходимо. - person Jayson Minard; 08.06.2017
comment
@JaysonMinard Спасибо за вклад, изменили ответ с указанием причины - person Arun Shankar; 09.06.2017