1

这是来自 Android 开发者网站的示例代码:

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 回答