这是来自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类型的对象。以前的代码是什么情况?
答案 0 :(得分:3)
的对象
new DownloadImageTask()
创建DownloadImageTask
类
是。因为它是一个内部类,它会隐式地将当前的封闭实例传递给(隐藏)构造函数,但这对构造函数调用来说甚至有点不寻常。
匿名类创建表达式始终使用new Something() { ... }
括号。
如果类实例创建表达式在类主体中结束,则实例化的类是匿名类。
答案 1 :(得分:3)
它创建了DownloadImageTask的对象。
如果它看起来像这样,那将是一个匿名类:
new DownloadImageTask(){ ... }.execute()