Выполнение 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();
Ответы
Ответ 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 через конструктор