Как выполнить действие после запуска и отображения действия - PullRequest
0 голосов
/ 08 апреля 2019

У меня есть два занятия.A и B.A Запускается B.

В B.onCreate() я вызываю функцию для загрузки файла, который мне нужен в этом упражнении: DownloadFile().

Для этой цели B имеетИндикатор выполнения, который я скрываю, как только загрузка закончится.

Я ожидал следующую последовательность действий:

  • A звонки startActivity()
  • B отображается
    • B показывает progressbar
    • B вызовов onCreate
    • B.DownloadFile() называется
    • Bскрывает progressBar

Но на самом деле происходит следующее:

  • A звонки startActivity()
    • Экранзастрял на A
    • B звонки onCreate
    • B.DownloadFile() вызывается
    • B никогда не показывает progressBar
  • B отображается, файл уже загружен, сразу скрывая progresbar.

Теперь, когда я делал то же самое в той же последовательности, но вместо загрузки файла, я транслировал его, все работало нормально.Но это может иметь какое-то отношение к тому, как MediaPlayer обрабатывает вещи.

Я попытался переключить onCreate на onStart или onResume с того, что я видел на этот ответ .Но происходит то же самое.

Я хочу переключить активность, и только после отображения B, я хочу, чтобы загрузка началась, но я не знаю как.

РЕДАКТИРОВАТЬ: По запросукод B

package com.skillcademy360.lite.activities

import android.os.Bundle
import android.support.v7.app.AppCompatActivity

class DownloadActivity: AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        DownloadFile()
    }

    fun DownloadFile() {
    }
}

Как я уже говорил, я уже пытался переключить onCreate на onStart и onResume и даже onPostCreate, которые не должны использоваться в любом случае.Но ни один из них не работает.

РЕДАКТИРОВАТЬ:

Я понимаю, что есть некоторые способы обойти эту проблему, но мне нужен прямой путь.Все это связано с наследованием и библиотекой, поэтому такие вещи, как «сохранение файла в качестве глобальной переменной», не сработают.

Приведенный выше код ведет себя так же, как и мой, поэтому янужно, чтобы эта проблема была точно решена без обходного пути с использованием AsyncTasks или глобальных переменных.

EDIT: чтобы уточнить.Я понимаю, что когда я звоню в onCreate, DownloadFile() блокирует пользовательский интерфейс.Однако, как показано ниже, то же самое происходит, когда я звоню в onResume.Насколько я понимаю, и как написано в жизненном цикле , видимый жизненный цикл должен начаться после onStart, но, похоже, он этого не делает.

package com.skillcademy360.lite.activities

import android.os.Bundle
import android.support.v7.app.AppCompatActivity

class DownloadActivity: AppCompatActivity() {
    override fun onResume(savedInstanceState: Bundle?) {
        super.onResume(savedInstanceState)
        DownloadFile()
    }

    fun DownloadFile() {
    }
}

Ответы [ 3 ]

2 голосов
/ 08 апреля 2019

Согласно Жизненный цикл активности :

onStart() вызывается, когда активность становится видимой для пользователя. Затем следует onResume(), если действие выходит на передний план, или onStop (), если оно становится скрытым.

Вы можете попытаться вызвать свой DownloadFile() метод создания фона Thread (поэтому загрузка не могла заблокировать пользовательский интерфейс) в B Activity onCreate() и начать показывать ProgressBar в onResume() или в onStart() .

РЕДАКТИРОВАТЬ : взгляните на этот пост

РЕДАКТИРОВАТЬ 2 : Если вы не хотите работать с глобальной переменной, вы можете вызвать метод DownloadFile() в onCreate(), показать ProgressBar, а затем выполнить все свои действия onPostDelayed() в том числе увольнение ProgressBar

РЕДАКТИРОВАТЬ 3 : Вероятно, вы не можете отображать анимированные ProgressBar, пока вы загружаете файл с тем же Thread, так как ваша загрузка заблокирует весь пользовательский интерфейс.

РЕДАКТИРОВАТЬ 4 :

  • Реальная последовательность ваших действий следующая:

    A звонки startActivity()

    onCreate() метод вызывается в B

    ProgressBar настроен в onCreate(), но будет отображаться только в onResume()

    • Метод DownloadFile() запустил и заблокировал весь пользовательский интерфейс

    • Методы onStart() и onResume() не были вызваны из-за DownloadFile() выполняя. Вот почему вы застряли на экране Activity A

    DownloadFile() закончено, методы onStart() и onResume() были названы. ProgressBar уволен.

0 голосов
/ 08 апреля 2019

Вы можете попробовать использовать AsyncTask, показать свой progressBar в методе onPreExecute (), загрузить файл в doInBackground () и скрыть индикатор выполнения в onPostExecute (),

Чем вы можете выполнить эту AsyncTask из метода onCreate () вашего действия B.

Надеюсь, это поможет.

Анкит Дубей

0 голосов
/ 08 апреля 2019

Что вы могли бы сделать, это создать индикатор выполнения в упражнении А, чтобы вы были уверены, что он вызывается, когда начинается ваше намерение. Загрузите файл в B, а затем только отмените его.

Не могли бы вы показать какой-нибудь код, если он все еще не работает? Что произойдет, если вы используете режим отладки?

...