Вы говорите,
Я звоню Task
таким образом (мой Activity.class
):
login = new Login(getApplicationContext(), this);
//this is an interface that i implements in Activity definition
loginButton.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
//execute() here, i cuted some not necesery code from here
try {
// im using get because i want to get valu from AsyncTask
login.execute(email, password).get();
}
catch(Exception e){ }
}
, но нет, вы не «вызывая» вашу задачу таким образом.Вы создаете один экземпляр задачи и настраиваете обработчик событий, который выполняет эту задачу - этот конкретный экземпляр - всякий раз, когда нажимается loginButton
.Поскольку каждый экземпляр AsyncTask
может быть выполнен только один раз, произойдет сбой при повторном нажатии кнопки входа (если не раньше, по какой-либо другой причине).
Вы также говорите,
Я прочитал, что мы можем сбросить AsyncTask, сделав новый AsyncTask
(Task = new Login()
)
, но нет , который ничего не сбрасывает, да и вообще AsyncTask
объекты не могут быть сброшены.Совет, который вы прочитали, состоял в том, чтобы заменить использованный AsyncTask
новым экземпляром.Создание нового AsyncTask
не оказывает особого влияния на других.Если вы хотите использовать этот подход, то он может выглядеть примерно так:
loginButton.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
Login myLoginTask = login; // keep a reference to the current task
login = new Login(... arguments ...); // create a new task for the next click
try {
// use the original task
myLoginTask.execute(email, password).get();
}
catch(Exception e){ }
}
Для этой конкретной реализации login
должно быть не-1035 *, поэтому, вероятно, переменная экземпляра содержащего класса, а нелокальная переменная метода, из которого был извлечен ваш код.
HOWEVER , ваш лучший путь вперед может состоять в том, чтобы вообще отказаться от AsyncTask
.Когда вы используете это так:
login.execute(email, password).get();
... вы побеждаете всю цель.Вы создаете поток, в котором выполняется блок до тех пор, пока задача не будет завершена (это то, что AsyncTask::get
равно для ), так что задача фактически синхронна.Если это то, что вам нужно, тогда вам нужно просто выполнить требуемую работу более напрямую, а не оборачивать ее в AsyncTask
.