0

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

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 完成,因为我依赖于它返回的数据。问题是,在执行任务时(它从互联网获取一些数据),按钮仍处于按下状态。即使我将创建的进度条设置为可见,它也不会显示。

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

4

1 回答 1

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()AsyncTaskAsyncTask.get()

doInBackground()从to返回你的结果onPostExecute(),这应该给你你想要的。您还可以在UIfromonPostExecute()或 other 的任何其他方法上执行任何您需要的操作。AsyncTaskdoInBackground()

进度条

您无需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) {
        ...
         }

使用回调

如果您需要得到一个不是 Activity 内部类的AsyncTask结果,那么您可以使用 a和 a 。更多关于在这个答案中这样做interfacecallBack

AsyncTask 文档

于 2013-07-02T12:39:18.950 回答