我有一个按钮,按下后会执行以下代码:
public void onClick(View v) {
// TODO Auto-generated method stub
//progressSpin.setVisibility(View.VISIBLE);
try {
data=new WebkioskExtractor().execute(username,password).get();
System.out.println("Data = "+data);
} catch (Exception e) {
// TODO Auto-geneorated catch block
e.printStackTrace();
}
//progressSpin.setVisibility(View.GONE);
}
从代码中清楚,我必须等待AsyncTask完成,因为我依赖它返回的数据。问题是,当执行任务(从互联网上获取一些数据)时,按钮仍处于按下状态。即使我将我创建的进度条设置为VISIBLE,它也不会显示。
我该如何解决这个问题?我希望按下按钮一次,然后进度条应该开始旋转,这不会发生。
答案 0 :(得分:5)
请勿使用get()
。
data=new WebkioskExtractor().execute(username,password).get(); // Bad! :(
data=new WebkioskExtractor().execute(username,password); // Good! :)
它阻止了UI
这就是为什么你的Button
仍然被按下的原因。这也是您ProgressBar
未显示的原因(它也会在UI
上运行)。我假设您在ProgressBar
中的onPreExecute()
和dismiss()
onPostExecute()
中AsyncTask
开始了AsyncTask
。如果没有,这就是你应该做的。如果您.get()
中的其他所有内容都已正确设置,则删除doInBackground()
可以解决您的问题。
将结果从onPostExecute()
返回到UI
,这样可以为您提供所需内容。您还可以onPostExecute()
AsyncTask
或[{1}}除doInBackground()
以外的任何其他方法执行您需要的任何操作。
<强>进度强>
您无需在Visibility
上设置ProgressBar
。见这个例子:
public class GetUsersTask extends AsyncTask<Void, Void, Void> {
ProgressDialog progress = ProgressDialog.show(LoginScreen.this, "Downloading Users", "Please wait while users are downloaded");
// you can create it here
@Override
protected void onPreExecute()
{
// show it here like so
progress.setCancelable(false);
progress.isIndeterminate();
progress.show();
}
@Override
protected void onPostExecute(Void result) {
// and dismiss it here
progress.dismiss();
}
}
@Override
protected void onProgressUpdate(Void... values) {
// can update the ProgressBar here if you need to
}
@Override
protected Void doInBackground(Void... params) {
...
}
如果您需要从AsyncTask
获得不属于您的活动的内部类的结果,那么您可以使用interface
callBack
。 More about doing that in this answer