1

これは、Android 開発者の Web サイトのサンプル コードです。

public void onClick(View v) {
    new DownloadImageTask().execute("http://example.com/image.png");
}

private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {
    /** The system calls this to perform work in a worker thread and
      * delivers it the parameters given to AsyncTask.execute() */
    protected Bitmap doInBackground(String... urls) {
        return loadImageFromNetwork(urls[0]);
    }

    /** The system calls this to perform work in the UI thread and delivers
      * the result from doInBackground() */
    protected void onPostExecute(Bitmap result) {
        mImageView.setImageBitmap(result);
    }
}  

ここで、 の行new DownloadImageTask().execute("http://example.com/image.png");new DownloadImageTask()、クラスのオブジェクトを作成しますDownloadImageTaskか、それとも を拡張する無名クラスを作成しますDownloadImageTaskか?

比較のために:
このコードでは、

public void onClick(View v) {
    new Thread(new Runnable() {
        public void run() {
            Bitmap b = loadImageFromNetwork("http://example.com/image.png");
            mImageView.setImageBitmap(b);
        }
    }).start();
}  

Thread クラスから派生したクラスのオブジェクトが作成され、インスタンス化されましたが、Thread 型のオブジェクトではなく、そのオブジェクトへの参照が保存されていません (これにより、将来再び使用できなくなります)。前のコードの場合はどうなりますか?

4

2 に答える 2

3

クラスnew DownloadImageTask()のオブジェクトを作成しますDownloadImageTask

はい。これは内部クラスであるため、現在の囲んでいるインスタンスを暗黙のうちに (非表示の) コンストラクターに渡しますが、そのコンストラクター呼び出しについては少し変わっているだけです。

匿名クラス作成式は、常にnew Something() { ... }中かっこと共に使用します。

JLS のセクション 15.9.1から:

クラス インスタンス作成式がクラス本体で終了する場合、インスタンス化されるクラスは無名クラスです。

于 2013-08-20T08:29:55.977 に答える
3

DownloadImageTask のオブジェクトを作成します。

次のように見える場合、匿名クラスになります。

new DownloadImageTask(){ ... }.execute()
于 2013-08-20T08:30:19.117 に答える