0
    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

このショーなど:

質問があります。

bg0、bg1、b2 がログに記録されているのに、onProgressUpdate と onPostExecute がサービス コールバックを必要としてから実行される理由。

09-22 13:13:09 サービス開始

しかし、まだ 09-22 13:13:24.824 BroadCast がコールバックし、onProgressUpdate と onPostExecute が実行を開始します。

なぜそうなるのか知りたいです。

検索してみましたが、いいキーワードの書き方がわからず、答えが見つかりませんでした。

心から感謝します。

4

2 に答える 2

0

知りたいのですが、なぜonProgressUpdateがpublishProgressの後に実行されるのですか? それは論理的です。publishProgress(progress . . .)を呼び出すと、これはonProgressUpdate (progress . . .)に情報を送信したことを意味します。(onProgressUpdate の UI スレッドで公開される値) これにより、UI の関連するコントロール (進行状況バーなど) が更新されます。

于 2013-09-22T13:57:45.280 に答える
0

AsycTask で

これらの関数が呼び出される順序があります

doInBackground (Params...)がいくつかの単位タスクを完了すると、それを publishProgress(Progress...) にプッシュし、onProgressUpdate(Progress...)を呼び出して UI を更新します。

1 onPreExecute()。タスクが実行される前に UI スレッドで呼び出されます。このステップは、通常、タスクをセットアップするために使用されます。たとえば、ユーザー インターフェイスに進行状況バーを表示します。

2.) doInBackground(Params...) onPreExecute() の実行が終了した直後にバックグラウンド スレッドで呼び出されます。このステップは、時間がかかる可能性のあるバックグラウンド計算を実行するために使用されます。非同期タスクのパラメーターがこのステップに渡されます。

計算の結果は、このステップによって返される必要があり、最後のステップに戻されます。

このステップでは、publishProgress(Progress...)を使用して、進行状況の 1 つ以上のユニットを公開することもできます。これらの値は、UI スレッドの onProgressUpdate(Progress...) ステップで発行されます。

3.) onProgressUpdate(Progress...)、 publishProgress(Progress...) の呼び出し後に UI スレッドで呼び出されます。

実行のタイミングは未定義です。このメソッドは、バックグラウンド計算がまだ実行されている間に、ユーザー インターフェイスに任意の形式の進行状況を表示するために使用されます。たとえば、進行状況バーをアニメーション化したり、テキスト フィールドにログを表示したりするために使用できます。

4.) onPostExecute(Result)。バックグラウンド計算が終了した後に UI スレッドで呼び出されます。バックグラウンド計算の結果は、パラメーターとしてこのステップに渡されます。

于 2013-09-22T13:36:47.257 に答える