2013-05-06 93 views
1

我想有一个ProgressDialog出现时onPreExecute(在AsyncTask开始),在做一些doInBackground()的东西,在onPostExecute()关闭ProgressDialog后。Android的 - 的AsyncTask - onPreExecute()运行doInBackground()完成

无处不看我认为这应该是简单而直接的,但我必须做错事。

每当我在我的应用程序更新点击ButtonAsyncTask运行应用程序死机,等待了一下,然后立刻ProgressDialog出现并消失,完成doInBackground()工作。我不明白为什么onPreExecute()正在doInBackground()之后运行,但这似乎正是这里发生的情况。下面是代码:

public class UpdateStats extends AsyncTask<CatchAPI, Void, String[]> { 

    private ProgressDialog pdia; 
    private Context context; 
    private APIParser parser = new APIParser(); 

    public UpdateStats(Context contexts) { 
     context = contexts; 
    } 

    @Override 
    protected void onPreExecute() { 
     pdia = new ProgressDialog(context); 
     pdia.setMessage("Loading..."); 
     pdia.show(); 
     super.onPreExecute(); 
    } 

    @Override 
    protected String[] doInBackground(CatchAPI... api) { 

     String apiOutput = api[0].returnAPI(); 

     return new String[] { 
       parser.getPoolName(apiOutput), 
       parser.getHashRate(apiOutput), 
       parser.getWorkers(apiOutput), 
       parser.getSharesThisRound(apiOutput) 
      }; 
    } 

    @Override 
    protected void onPostExecute(String[] result) { 
     pdia.dismiss(); 
     super.onPostExecute(result); 
    } 

} 

而且onClickListener在MainActivity:

updateButton.setOnClickListener(new View.OnClickListener() { 

    @Override 
    public void onClick(View v) { 
     String[] text = null; 
     UpdateStats updater = new UpdateStats(context); 
     try { 
      text = updater.execute(api).get(); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } catch (ExecutionException e) { 
      e.printStackTrace(); 
     } 
     poolNameTV.setText(text[0]); 
     hashRateTV.setText(text[1]); 
     workersTV.setText(text[2]); 
     sharesThisRoundTV.setText(text[3]); 
    } 
}); 

回答

7

在这里:

text = updater.execute(api).get(); //<<< 

你调用AsyncTask.get()其冻结UI线程执行,直到doInBackground执行不彻底。执行的AsyncTask为:

updater.execute(api) 

和更新内部onPostExecute UI元素,其呼吁时doInBackground执行完整的UI线程。

@Override 
protected void onPostExecute(String[] result) { 
    pdia.dismiss(); 
    // update UI here.. 
    poolNameTV.setText(result[0]); 
    hashRateTV.setText(result[1]); 
    workersTV.setText(result[2]); 
    sharesThisRoundTV.setText(result[3]); 

    super.onPostExecute(result); 

} 
+0

完美,这就是它。谢谢! – DemonWav 2013-05-06 03:09:08

+0

起初它不让我接受它,现在它会。再次感谢。 – DemonWav 2013-05-06 03:19:42

相关问题