Android - AsyncTask - onPreExecute()在doInBackground()完成后运行

时间:2013-05-06 02:56:22

标签: android android-asynctask

我试图在ProgressDialog在onPreExecute()中启动时显示AsyncTask,在doInBackground()中执行某项操作,并在{{{}}中关闭ProgressDialog 1}}。

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

每当我点击我的应用中的onPostExecute()进行更新并运行Button时,该应用会冻结,等待一下,然后AsyncTask会立即显示并消失,随着工作在ProgressDialog已完成。我不明白为什么doInBackground()onPreExecute()之后运行,但这似乎正是这里发生的事情。这是代码:

doInBackground()

MainActivity中的onClickListener:

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);
    }

}

1 个答案:

答案 0 :(得分:7)

在这里:

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

您正在调用AsyncTask.get(),冻结UI线程执行,直到doInBackground执行未完成。执行AsyncTask as:

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);

}
相关问题