2013-06-21 112 views
0

我需要显示progrees对话框。这很简单,但我绝对需要等待直到asynctask完成。这给我带来了一些困难。等待完成asynctask方法.get()被使用。但是这个方法blocks我的进度对话框。 那么,如何取消阻止progressdialog获取或可以取代.get()disparying progressdialog的困难

我在以下方法调用操作:

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 
      */ 
     } 
    } 
+1

在onPreExecute和隐藏在onPostExecute中显示的问题是什么? – stinepike

+0

忘记删除评论。 .get()被调用时,preexecute/postexecute - dialog的问题不会弹出。在这种情况下,asynctask完成后对话框会闪烁半秒。 – Yarh

+0

你可以调用doInBackground中的get方法 – stinepike

回答

1

不要使用.get()因为你已经看到它阻止UI。如果您需要检查任务是否完成,您可以使用getStatus()。删除.get()应允许您的ProgressDialog显示。如果你有一些代码必须等到AsyncTask完成,然后把它放在onPostExecute()或调用一个函数从那里

如果您需要从AsyncTask完成任务后引用一些在MainActivity,只需创建一个构造带和你的Activity的引用传递contextconstructor

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 
    } 
+0

听起来不错。但是,我可以把另一个asynctaks放在第一个asynctask的postExecute()上吗? .get()的神秘性引发了,因为我给了几个网络操作,其中的网络调用下载选项用于下一个操作。 – Yarh

+0

是的,你可以做到这一点 – codeMagic

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 
      } 
1

您可能想要将您的代码更改为这样的东西。 将之后要运行的代码封装在可运行的程序中,并将其传递给异步任务。

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

这里是修改后的操作类。

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