0

我需要显示进度对话框。这很简单,但是我绝对需要等到 asynctask 完成。这暴露了我的一些困难。使用asynctask 方法等待完成.get()。但是这种方法blocks是我的进度对话框。progressdialog那么,我怎样才能用 get 或什么可以替代来解除阻塞.get()呢?

我通过以下方式调用操作:

Operation o = new Operation();
o.execute(params);
try {
            o.get();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ExecutionException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

类操作

class Operation extends AsyncTask<String, Void, JSONObject> {
        ProgressDialog pd;
        Context con;

        @Override
        protected void onPreExecute() {
            pd = new ProgressDialog(app);
            pd.setOwnerActivity(app);
            pd.setTitle("Идет загрузка...");
            pd.setCancelable(true);
            pd.show();
        }

        @Override
        protected JSONObject doInBackground(String... option) {
            /*
            some job
            */

            return json;
        }

        @Override
        protected void onPostExecute(JSONObject result) {
            super.onPostExecute(result);
            pd.dismiss();

            /* 
            some job
            */
        }
    }
4

3 回答 3

1

尝试使用这种方式

private ProgressDialog dialog=null;

     @Override
            protected void onPreExecute() {
                dialog = ProgressDialog.show(this, "", "Please! Wait...",true);
            }


            @Override
            protected void onPostExecute(JSONObject result) {
                super.onPostExecute(result);
                dialog.dismiss();
               // use here code
            }
于 2013-06-21T16:03:15.963 回答
1

不要.get()像你看到的那样使用它会阻止UI. getStatus()如果您需要检查任务是否完成,您可以使用。删除.get()应该允许您ProgressDialog显示。如果您的代码必须等到AsyncTask完成,则将其放入onPostExecute()或从那里调用函数

如果您需要在完成后引用MainActivityfrom the中的某些AsyncTask内容,只需创建一个构造函数来获取您的引用Activity并传递context给您的constructor

Operation o = new Operation(this);

并在构造函数中引用它

lass Operation extends AsyncTask<String, Void, JSONObject> {
    ProgressDialog pd;
    Context con;
    Activity act;

  public Operator(Activity curAct)
  {
      act = curAct;   // can use this reference to access methods in your Activity  
   }
于 2013-06-21T16:02:48.247 回答
1

您可能希望将代码更改为类似的内容。将您想要在之后运行的代码包装在一个可运行文件中并将其传递给您的异步任务。

 Runnable onEnd = new Runnable(){
    //code to run after the task has completed
 }
 Operation o = new Operation(onEnd);
 o.execute(params);

这是修改后的 Operation 类。

class Operation extends AsyncTask<String, Void, JSONObject> {
    ProgressDialog pd;
    Context con;
    Runnable afterwards = null;

    Operation(Runnable afterwards){
      this.afterwards  = afterwards ;
    }

    @Override
    protected void onPreExecute() {
        pd = new ProgressDialog(app);
        pd.setOwnerActivity(app);
        pd.setTitle("Идет загрузка...");
        pd.setCancelable(true);
        pd.show();
    }

    @Override
    protected JSONObject doInBackground(String... option) {
        /*
        some job
        */

        return json;
    }

    @Override
    protected void onPostExecute(JSONObject result) {
        super.onPostExecute(result);
        pd.dismiss();

        /* 
        some job
        */
        if (afterwards  != null)
           afterwards.run();
    }
}

注意afterwards.run()onPostExecute.

于 2013-06-21T16:08:16.320 回答