android – 按钮在执行Asynctask时仍然按下
作者:互联网
我有一个按钮,按下后,执行以下代码:
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,也不会显示.
我怎样才能解决这个问题?我希望按下按钮一次,然后进度条应该开始旋转,这不会发生.
解决方法:
不要使用get().
data=new WebkioskExtractor().execute(username,password).get(); // Bad! :(
data=new WebkioskExtractor().execute(username,password); // Good! :)
它会阻止UI,这就是按钮保持按下的原因.这也是您的ProgressBar未显示的原因(它也在UI上运行).我假设您在onPreExecute()中启动ProgressBar并在AsyncTask的onPostExecute()中解除()它.如果没有,这就是你应该做的.如果AsyncTask中的其他所有内容都已正确设置,那么删除.get()可以解决您的问题.
将结果从doInBackground()返回到onPostExecute(),这应该可以为您提供所需的结果.除了doInBackground()之外,您还可以从onPostExecute()或AsyncTask的任何其他方法在UI上执行任何操作.
进度条
您无需在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获取结果,而不是Activity的内部类,那么您可以使用带有callBack的接口. More about doing that in this answer
标签:android,android-asynctask,android-progressbar 来源: https://codeday.me/bug/20191002/1842909.html