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

时间:2013-07-02 12:35:59

标签: android android-asynctask android-progressbar

我有一个按钮,按下后会执行以下代码:

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,它也不会显示。

我该如何解决这个问题?我希望按下按钮一次,然后进度条应该开始旋转,这不会发生。

1 个答案:

答案 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 callBackMore about doing that in this answer

AsyncTask Docs