Android AsyncTask调用onProgressUpdate或onPostExecute延迟

时间:2013-09-22 13:24:20

标签: android android-asynctask

    class DoLogin extends AsyncTask<String, Integer, String> {// 继承AsyncTask
    @Override
    protected String doInBackground(String... params) {// 处理后台执行的任务,在后台线程执行
        ServerAnalyze.log("消息", "登陆", "手动登陆函数开始启动.");

        EditText etStuId = (EditText) findViewById(R.id.tbStudentID);
        EditText etPwd = (EditText) findViewById(R.id.tbPassword);

        global.setStudentID(etStuId.getText().toString());
        String Password = etPwd.getText().toString();
        global.setImei(((TelephonyManager) getSystemService(TELEPHONY_SERVICE))
                .getDeviceId());
        Log.i("loginclick", "bg0");
        global.giitServiceInterface.SendBroadCast_Login(global.getStudentID(), Password, global.getImei());
        Log.i("loginclick", "bg1");
        publishProgress(0);
        Log.i("loginclick", "bg2");
        return "";
    }

    protected void onProgressUpdate(Integer... progress) {// 在调用publishProgress之后被调用,在ui线程执行
        Log.i("loginclick", "update");
    }

    @Override
    protected void onPostExecute(String result) {// 后台任务执行完之后被调用,在ui线程执行
        // progressDialog.dismiss();
        Log.i("loginclick", "finish");
    }

    @Override
    protected void onPreExecute() {// 在doInBackground(Params...)之前被调用,在ui线程执行

        Button btnloginButton = (Button) findViewById(R.id.btnlogin);
        btnloginButton.setText("正在登陆中,请稍候...");
        btnloginButton.setBackgroundColor(getResources().getColor(
                R.color.huise));
    }

    protected void onCancelled() {// 在ui线程执行

    }

}

09-22 13:13:09.753: I/loginclick(1751): bg0
09-22 13:13:09.763: I/loginclick(1751): bg1
09-22 13:13:09.763: I/loginclick(1751): bg2
09-22 13:13:09.773: I/Giit Service(1751): Start
09-22 13:13:24.824: I/loginclick(1751): update
09-22 13:13:24.824: I/loginclick(1751): finish
09-22 13:13:24.834: I/[GiitParamClass-Action](1751): 1
09-22 13:13:24.844: I/[GiitParamClass-BooleanResult](1751): false
09-22 13:13:24.844: I/[GiitParamClass-intResult](1751): 0

09-22 13:13:09.753: I/loginclick(1751): bg0 09-22 13:13:09.763: I/loginclick(1751): bg1 09-22 13:13:09.763: I/loginclick(1751): bg2 09-22 13:13:09.773: I/Giit Service(1751): Start 09-22 13:13:24.824: I/loginclick(1751): update 09-22 13:13:24.824: I/loginclick(1751): finish 09-22 13:13:24.834: I/[GiitParamClass-Action](1751): 1 09-22 13:13:24.844: I/[GiitParamClass-BooleanResult](1751): false 09-22 13:13:24.844: I/[GiitParamClass-intResult](1751): 0

这样的节目:

我有一个问题。

为什么bg0,bg1,b2已经记录,但onProgressUpdate和onPostExecute需要服务回调然后才能运行。

09-22 13:13:09服务开始

但仍然是09-22 13:13:24.824 BroadCast回调然后onProgressUpdate和onPostExecute开始运行。

我想知道,为什么会这样。

我尝试搜索,但我不知道如何编写一个好的关键字。所以我找不到anwser。

sincere.thanks。

2 个答案:

答案 0 :(得分:0)

在AsycTask中

有一个命令可以调用这些函数

doInBackground(参数...)完成一些单位任务时,它会将其推送到 publishProgress(进度...),并调用onProgressUpdate(进度.. 。)更新用户界面

1 onPreExecute(),在执行任务之前在UI线程上调用。  此步骤通常用于设置任务,例如通过在用户界面中显示进度条。

2。) doInBackground(Params ...),在onPreExecute()完成执行后立即在后台线程上调用。 此步骤用于执行可能需要很长时间的后台计算。  异步任务的参数将传递给此步骤。

计算结果必须由此步骤返回,并将传递回最后一步。

此步骤还可以使用 publishProgress(Progress ...)来发布一个或多个进度单元。 这些值发布在UI线程的onProgressUpdate(Progress ...)步骤中。

3。) onProgressUpdate(Progress ...),在调用publishProgress(Progress ...)后在UI线程上调用。

执行的时间未定义。此方法用于在后台计算仍在执行时显示用户界面中的任何形式的进度。例如,它可用于为进度条设置动画或在文本字段中显示日志。

4。) onPostExecute(Result),在后台计算完成后在UI线程上调用。后台计算的结果作为参数传递给此步骤。

答案 1 :(得分:0)

所以你想知道为什么 onProgressUpdate publishProgress 之后运行?这是合乎逻辑的。当您调用 publishProgress(progress ...)时,这表示您已将信息发送到 onProgressUpdate(进度...)。 (要在UI线程上发布的值,在onProgressUpdate中),它将更新UI中的相关控件(进度条等)。