与disaplying progressdialog的困难

时间:2013-06-21 15:57:30

标签: android android-asynctask progressdialog

我需要显示进度对话框。这很简单,但我绝对需要等到asictask才能完成。这给我带来了一些困难。等待完成asynctask方法.get()被使用。但是这个方法blocks我的进度对话框。 那么,如何使用get取消progressdialog或使用哪些内容替换.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
            */
        }
    }

3 个答案:

答案 0 :(得分:1)

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

如果您需要在MainActivity完成后引用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  
   }

答案 1 :(得分: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
            }

答案 2 :(得分:1)

您可能希望将代码更改为此类代码。 在runnable中包装您想要运行的代码并将其传递给异步任务。

 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