Подтвердить что ты не робот

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

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

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

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();

4b9b3361

Ответ 1

Вам нужно иметь ссылку 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.

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

Ответ 2

Просто создайте контекст для класса Activity

((Activity)context).runOnUiThread(new Runnable()
    {
        public void run()
        { 
             Toast.makeText(context, toast, Toast.LENGTH_SHORT).show();
        }
    });

Ответ 3

Для этого вам нужен объект Activity. Передайте свою активность этой ссылке через конструктор и используйте ее в своей 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 через конструктор