你说,
我打电话
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
实例只能执行一次,这将在第二次单击“登录”按钮时失败(如果不是很快,由于其他原因)。
你也说,
我读到了,我们可以通过创建新的
异步任务
(
Task = new Login()
)
但是
不
,不会重置任何内容,而且确实
异步任务
无法重置对象。你读到的建议是
代替
使用过的
异步任务
有了新的实例。实例化新的
异步任务
对其他人没有特别的影响。如果您希望采用这种方法,那么它可能看起来像这样:
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
非
final
,所以可能是包含类的实例变量,而不是从中摘录代码的方法的局部变量。
然而
你最好的前进方式可能是放弃
异步任务
总而言之。当您这样使用它时:
login.execute(email, password).get();
…你挫败了整个目标。您正在创建一个线程,在该线程中运行块,直到任务完成(这就是
AsyncTask::get
是
对于
,因此任务是有效同步的。如果这是你所需要的,那么你应该更直接地完成你想要的工作,而不是把它包装在
异步任务
.