其他分享
首页 > 其他分享> > android – 按钮在执行Asynctask时仍然按下

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

AsyncTask Docs

标签:android,android-asynctask,android-progressbar
来源: https://codeday.me/bug/20191002/1842909.html