выполнение runOnUiThread в отдельном классе [duplicate]

Возможный дубликат:
Android как запустить OnUiThread в другом классе?

Мои Asyn Classes - это отдельный файл классов.

public class AdamTask extends AsyncTask<String, Void, String>{
         public void showToast(final String toast)
        {
            runOnUiThread(new Runnable() {
                public void run()
                {
                    Toast.makeText(context, toast, Toast.LENGTH_SHORT).show();
                }
            });
        }
}

Как мне выполнить этот метод в моем классе AsyncTask? Я получаю ошибку МетодrunOnUiThread(new Runnable(){}) is undefined for the type AdamTask

новый AdamTask (Eve.this,How to pass the eve activity here) .Execute ();

Ответы на вопрос(3)

Просто введите контекст в класс Activity

((Activity)context).runOnUiThread(new Runnable()
    {
        public void run()
        { 
             Toast.makeText(context, toast, Toast.LENGTH_SHORT).show();
        }
    });
 Piolo Opaw20 июн. 2014 г., 08:19
спаси меня от воссоздания перегруженного конструктора хе-хе приведение типов спаси меня tnx братан!
 Ale Muzzi11 дек. 2016 г., 15:57
Это не всегда работает, вы должны быть уверены, что то, что вы используете, фактически является Activity, или у вас будет ClassCastException. Для этого вы можете сделать "if (context instanceOf Activity) {// продолжить преобразование}"
 Nitish17 окт. 2014 г., 00:22
Огромное спасибо. Вы спасли день :)

ьности через конструктор и используйте ее в AsyncTask.

public class AdamTask extends AsyncTask<String, Void, String>{
         public void showToast(final String toast)
        {
            activityObj.runOnUiThread(new Runnable() {
                public void run()
                {
                    Toast.makeText(context, toast, Toast.LENGTH_SHORT).show();
                }
            });
        }
}

Поскольку runOnUiThread является открытым методом в классе Activity, вы не можете использовать его в каком-либо другом пользовательском классе или классе, который расширяется, кроме самого Activity.

Смотри сюда,runonUi.

Если вы не уверены, пожалуйста, проверьте этоответ научиться отправлять Activity Object через конструктор

Решение Вопроса

Вам нужно иметьActivity's ссылка (давайте назовем этоactivity) и передать его вашемуAsyncTask класс. Тогда вы можете позвонитьrunOnUiThread нравится:

activity.runOnUiThread

runOnUiThread это метод, определенный вActivity класс.

Просто добавьте contsructor к вашей AsyncTask. Ваш AsyncTask будет выглядеть так:

public class AdamTask extends AsyncTask<String, Void, String> {

private Activity activity; //activity is defined as a global variable in your AsyncTask

public AdamTask(Activity activity) {

    this.activity = activity;
}

public void showToast(final String toast)
    {
        activity.runOnUiThread(new Runnable() {
            public void run()
            {
                Toast.makeText(activity, toast, Toast.LENGTH_SHORT).show();
            }
        });
    }

...

}

Затем позвонитьAsyncTask вам нужно что-то вроде этого:

AdamTask adamTask = new AdamTask(Eve.this);
adamTask.excecute(yourParams);

ОБНОВИТЬ Как Сэм упомянул в комментариях,AsyncTasks может привести кcontext утечка при изменении конфигурации (например, когда экран вращается иActivity воссоздан). Способ справиться с этим являетсябез головыfragment техника.

Другой способ, более эффективный, это использование шины событий. ВидетьВот для получения дополнительной информации (ссылка, предоставленная Сэмом в комментариях).

 Gaurav Varshney29 янв. 2017 г., 07:23
Хорошее решение!
 Sam10 июн. 2015 г., 10:15
Брилл, спасибо. Еще один блог, о котором стоит упомянуть:simonvt.net/2014/04/17/asynctask-is-bad-and-you-should-feel-bad
 Angelo10 июн. 2015 г., 08:48
@Sam Обновил мой ответ. Спасибо за головы!
 Sam09 июн. 2015 г., 20:10
Эй, вы, вероятно, должны упомянуть о проблемах с утечкой активности от AsyncTasks
 Angelo10 июн. 2015 г., 14:28
@ Сэм Отлично! Это еще лучшее решение.

Ваш ответ на вопрос