正在执行Asynctask时按钮保持按下状态

Sid*_*rma 0 android android-progressbar 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);
        }
Run Code Online (Sandbox Code Playgroud)

从代码中清楚,我必须等待AsyncTask完成,因为我依赖于它返回的数据.问题是,当执行任务(从互联网上获取一些数据)时,按钮仍处于按下状态.即使我将我创建的进度条设置为VISIBLE,也不会显示.

我怎样才能解决这个问题?我希望按下按钮一次,然后进度条应该开始旋转,这不会发生.

cod*_*gic 5

不要用get().

data=new WebkioskExtractor().execute(username,password).get();  // Bad! :(

data=new WebkioskExtractor().execute(username,password);  // Good! :) 
Run Code Online (Sandbox Code Playgroud)

它阻止了UI你的Button遗体按压的原因.这也是你ProgressBar没有出现的原因(它也在运行UI).我假设你开始你ProgressBaronPreExecute()dismiss()它在onPostExecute()你的AsyncTask.如果没有,这就是你应该做的.如果您的其他所有内容都已AsyncTask正确设置,则删除.get()应解决您的问题.

将结果返回doInBackground()onPostExecute(),这应该给你你想要的.你也可以做任何你需要在UIonPostExecute()或的任何其他方法AsyncTask之外doInBackground().

进度条

你并不需要设置VisibilityProgressBar.看这个例子:

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) {
        ...
         }
Run Code Online (Sandbox Code Playgroud)

使用回调

如果你需要得到的结果从AsyncTask其中是不是一个内部类的活动,那么你可以使用interface一个callBack.更多关于在这个答案中做到这一点

AsyncTask文档