0

それで、最近出会ったことについて、やや一般的な質問があります。Activity と Task の 2 つのクラスがあるとします。Activity では、新しい Task オブジェクトがインスタンス化されますが、通常のパラメーターが与えられる代わりに、後でいくつかの新しいコードが括弧内に導入され、そのインスタンス化でそのメソッドの 1 つが呼び出されます。オブジェクトが作成されるとすぐにメソッドが呼び出されるのを見てきましたが、その動作も再定義されていません。これはすべて Android ベースなので、それに関連しているのかもしれませんが、この構文的に奇妙なものは、Android が導入したものというよりも Java の概念のように思えます。クラスファイルは次のとおりです。

class Task extends AsyncTask<String, Void, String> {

    @Override
    protected String doInBackground(String... args) {

        try {
        //do things here
        } catch (Exception ex) {
        ex.printStackTrace();
        Log.e("Exception", ex.toString());
        }

        return Text;
    }

}

これは作成されるオブジェクトであり、それをインスタンス化するコードは次のとおりです。

new Task() {
                    @Override
                    public void onPostExecute(String result) {
                        Log.d("JSON", result);
                        try {
                            if (jObject.has("error")) {
                                //Do something here
                            }
                            else if (!paymentCheck(appDomain)){
                                //do something else
                            }
                            else {
                                //Do last thing
                            }
                        } catch (JSONException e) {
                            throw new RuntimeException(e);
                        }
                    }
                }.execute(appDomain, email, password);

AsyncTask は、doInBackground メソッドからの結果を別のスレッドの onPostExecute メソッドに渡すという点で風変わりなクラスであることを理解しています。おそらくそれがこれが行われる理由ですが、Tasks で onPostExecute を定義しない理由がよくわかりません。他の例で見たように、独自のクラスファイル。また、このことは完全に正常にコンパイルおよび実行され、想定されているすべてのことを実行します。私は背後にある理由を本当に理解していません。うまくいけば、ここの誰かが助けてくれるでしょう!ありがとう

4

2 に答える 2

2

これは、無名クラスと呼ばれる Java シンタックス シュガーです。

于 2013-07-09T21:32:11.557 に答える
0

私は Android 開発者ではないので、そこにある特殊性に完全に精通しているわけではありませんが、このパターンは、デッドロックなどを回避するために別のスレッドで応答アクションが発生することを確認する必要がある場合、またはonPostExecuteがオブジェクトを操作する場合に使用されます。では表示されませんTask。これは、スコープ内にあるすべてのオブジェクトに対する一種のクロージャーとして機能します。final

于 2013-07-09T21:36:21.043 に答える