显示从URL到Android应用的图片

时间:2017-09-24 11:17:52

标签: c# android image visual-studio url

我正在尝试将特定网址中的图片显示在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#。

谢谢

3 个答案:

答案 0 :(得分:0)

使用Glide

GlideApp
    .with(this)
    .load("http://image10.bizrate-images.com/resizesq=60&uid=2216744464")
    .into(imageView);
  

Glide是一种快速高效的开源媒体管理和图像   Android的加载框架包装媒体解码,内存和   磁盘缓存,资源池化成简单易用   接口

答案 1 :(得分:0)

最快的方法:

您可以尝试使用Android的这些图片下载库 - PicassoGlide。您可以在片段或活动或适配器中使用其中一个:

<强>毕加索

// .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中。

步骤:

  • 创建服务(并添加到清单)。
  • 服务应该扩展IntentService(并实现onHandleIntent)。
  • 从意图中检索网址。
  • 从网址获取图片。
  • 解码并将网址保存到位图。
  • 将位图放在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();
        }
    }
}

现在,我们需要一个类来封装从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是最好的。但是如果你想要更多的自定义,动画GIF支持和更好的内存管理,那么你可以继续使用Glide库。

这里是两者的代码。

毕加索:

 Picasso.with(context)
 .load(url)
 .centerCrop()
 .placeholder(R.drawable.loading_spinner)
 .into(myImageView);

For Glide

Glide.with(context)
.load(url)
.centerCrop()
.placeholder(R.drawable.loading_spinner)
.crossFade()
.into(myImageView);