Как я могу запустить свой код после того, как Activity станет видимым? - PullRequest
3 голосов
/ 02 апреля 2012

У меня есть активность с 3 счетчиками. Эти счетчики получают свои данные из веб-сервиса методом, который занимает около 1 минуты.

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

@Override
protected void onCreate() {

    //.........    


    final Runnable r = new Runnable()
    {
        public void run()
        {
            loadMyData();
        }
    };
    Utilities.performOnBackgroundThread(r);    
}

@Override
protected void onResume() {

    new Thread() {
        @Override
        public void run() {
            loadMyData();
        }
    }.start();
    super.onResume();

}

@Override
protected void onStart() {
    if (comesFromOnCreateMethod)
    {
        final Runnable r = new Runnable()
        {
            public void run()
            {
                loadMyData();
            }
        };
        Utilities.performOnBackgroundThread(r);
    }
    comesFromOnCreateMethod = false;
    super.onStart();
}

@Override
protected void onResume() {

    if (comesFromOnCreateMethod)
    {
        final Runnable r = new Runnable()
        {
            public void run()
            {
                loadMyData();
            }
        };
        Utilities.performOnBackgroundThread(r);
    }
    comesFromOnCreateMethod = false;

}

Ответы [ 4 ]

4 голосов
/ 02 апреля 2012

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

Одним из лучших решений для фоновой работы является AsyncTask . Используя это, вы можете вызвать его в своем методе onCreate (), и когда он будет готов, он отправит обратный вызов в поток пользовательского интерфейса, в котором вы сможете отобразить свои данные.

Если вы хотите, чтобы этот метод запускался при каждом отображении этого действия, вызовите его в onResume (). В противном случае, вызовите его в onCreate ().

2 голосов
/ 02 апреля 2012

В вашем onCreate выполните асинхронные задачи, как советовали другие. Убедитесь, что вы сначала сгенерировали контент для приложения, а затем вызвали asyncTasks. Вы можете контролировать свои счетчики с помощью обратного вызова.

1 голос
/ 02 апреля 2012

Используйте AssynchTask(), и вам следует сначала вызвать super. onResume() или любой метод жизненного цикла в соответствующем методе жизненного цикла, а затем другой конкретный метод, который вы хотите выполнить ....

1 голос
/ 02 апреля 2012

Прежде всего, вы можете захотеть увеличить свой коэффициент приема, 39% довольно низок.

В любом случае, вы можете проверить AsyncTask, он должен сделать это. http://developer.android.com/reference/android/os/AsyncTask.html

Как правило, вы хотите инициализировать в onPreExecute, выполнить сетевое взаимодействие в doInBackGround и установить результат в поток пользовательского интерфейса на OnPostExecute. Надеюсь, это поможет.

...