我正在尝试将特定网址中的图片显示在Android应用内的图片视图中。我正在尝试使用这个问题的答案 here但我在代码中遇到了一个愚蠢的错误:
public static Drawable LoadImageFromWebOperations(String url) {
try {
InputStream ss = (InputStream) new URL(url).getContent(); // here is the error saying that "There is no argument given that corresponds to the required formal parameter 'types' of 'URL.GetContent(Class [])"
Drawable d = Drawable.createFromStream(ss, "src name"); // and another error here saying: Cannot convert from 'Java.IO.InputStream' to 'System.IO.Stream'
return d;
} catch (Exception e) {
return null;
}
}
第一个错误:“没有给出对应于'URL.GetContent(Class [])”
所需的形式参数'types'的参数第二个错误:“无法从'Java.IO.InputStream'转换为'System.IO.Stream'”
所以我搜索了另一个解决方案,我找到了这个:
URL url = new URL("http://image10.bizrate-images.com/resizesq=60&uid=2216744464");
Bitmap bmp =
BitmapFactory.decodeStream(url.openConnection().getInputStream());
imageView.setImageBitmap(bmp);
但我也遇到openconnection()
和getInputStream
错误。
请告诉我如何解决我的问题,或者如果您有针对c#用户的其他解决方案,请告诉我。
注意:我正在使用Visual Studio中的c#。
谢谢
答案 0 :(得分:0)
使用Glide:
GlideApp
.with(this)
.load("http://image10.bizrate-images.com/resizesq=60&uid=2216744464")
.into(imageView);
Glide是一种快速高效的开源媒体管理和图像 Android的加载框架包装媒体解码,内存和 磁盘缓存,资源池化成简单易用 接口
答案 1 :(得分:0)
您可以尝试使用Android的这些图片下载库 - Picasso或Glide。您可以在片段或活动或适配器中使用其中一个:
<强>毕加索强>:
// .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中。
onHandleIntent
)。清单:
<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();
}
}
}
现在,我们需要一个类来封装从Service类发送的位图对象。 EventBus传输的对象也称为events
,这些事件可以包含其中的任意数量的其他对象 - 将EventBus视为将POJO(或事件)从一个地方传输到另一个地方的总线。
在这种情况下,EventBus将传输我们的Bitmap从后台线程到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;
}
}
MainActivity:
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的替代方案。
答案 2 :(得分:0)
Picasso.with(context)
.load(url)
.centerCrop()
.placeholder(R.drawable.loading_spinner)
.into(myImageView);
Glide.with(context)
.load(url)
.centerCrop()
.placeholder(R.drawable.loading_spinner)
.crossFade()
.into(myImageView);