最快的方法:
您可以尝试这些适用于 Android 的图像下载库 - Picasso 或 Glide。您可以在 Fragment 或 Activity 或 Adapter 中使用其中一个:
毕加索:
// .with() only takes Context objects
Picasso.with(context)
.load("http://image10.bizrate-images.com/resizesq=60&uid=2216744464")
.into(imageView);
滑行:
// .with() can take Context, Activity, Fragment or FragmentActivity objects.
Glide.with(context)
.load("http://image10.bizrate-images.com/resizesq=60&uid=2216744464")
.into(imageView);
这里有一个link,它解释了两个库之间的异同。
另一种方法:
它涉及创建一个服务来获取数据(在后台线程上),将 url 保存到位图中,最后将该位图发送回 UI 线程以保存在 ImageView 中。
步骤:
- 创建服务(并添加到清单中)。
- Service 应该扩展 IntentService(并实现
onHandleIntent)。
- 从意图中检索 url。
- 从 url 获取图片。
- 将网址解码并保存到位图。
- 将位图放在EventBus 中以发送到 UI 线程。
- 将位图设置为 ImageView。
清单:
<application
...
<activity android:name=".MainActivity">
...
</activity>
<service android:name=".ImageFetchService" />
</application>
Eventbus 依赖项(Android Studio 的 gradle,Visual Studio 的 Naxam-EventBus.Droid):
dependencies {
//
compile 'org.greenrobot:eventbus:3.0.0'
}
Install-Package Naxam.EventBus.Droid // Use this instead since Xamarin.Android doesn't have gradle.
服务类:
public class ImageFetchService extends IntentService {
public ImageFetchService() {
super("ImageFetchService");
}
@Override
protected void onHandleIntent(@Nullable Intent intent) {
String urlString = intent.getData().toString();
URL url;
try {
url = new URL(urlString);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.connect();
InputStream input = connection.getInputStream();
Bitmap myBitmap = BitmapFactory.decodeStream(input);
BitmapEvent bitmapEvent = new BitmapEvent();
bitmapEvent.setBitmap(myBitmap);
EventBus.getDefault().post(bitmapEvent);
} catch (java.io.IOException e) {
e.printStackTrace();
}
}
}
现在,我们需要一个类来封装从我们的服务类发送的位图对象。 EventBus 传输也称为 events 的对象,这些事件可以在其中包含任意数量的其他对象 - 将 EventBus 视为将 POJO(或事件)从一个地方传输到另一个地方的总线。
在这种情况下,EventBus 会将我们的位图从后台线程传输到 UI 线程。
BitmapEvent 类(EventBus 的 POJO):
public class BitmapEvent {
private Bitmap bitmap;
public BitmapEvent() {
//
}
public Bitmap getBitmap() {
return bitmap;
}
public void setBitmap(Bitmap bitmap) {
this.bitmap = bitmap;
}
}
主活动:
public class MainActivity extends AppCompatActivity {
ImageView imageView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageView = findViewById(R.id.image);
String urlString = "http://image10.bizrate-images.com/resizesq=60&uid=2216744464";
Intent fetchImageIntent = new Intent(this, ImageFetchService.class);
fetchImageIntent.setData(Uri.parse(urlString));
startService(fetchImageIntent);
}
@Override
protected void onStart() {
super.onStart();
EventBus.getDefault().register(this);
}
@Override
protected void onStop() {
super.onStop();
EventBus.getDefault().unregister(this);
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void getBitmapEvent(BitmapEvent bitmapEvent) {
imageView.setImageBitmap(bitmapEvent.getBitmap());
}
}
注意:根据您的互联网连接和图像的大小,您可能会注意到在 ImageView 使用位图更新之前存在一些延迟。
您可以查看 AsyncTask 作为 EventBus 的替代方案。