1

我在服务器上有多个图像。我想要做的是我想从服务器检索这些图像并将其设置在 imageView 上。

我一直在从服务器获取 blob 类型图像,将其解码为字节数组,然后将其转换为位图图像。

我对如何从服务器获取位图图像感到困惑。

我经历过很多关于 SO 的问题

将图像从服务器检索到 android 应用程序

从 Android 上的服务器加载大图像

请任何人提供链接或代码帮助。

感谢您宝贵的时间。

我正在尝试,这里是代码:

public class MainActivity extends Activity {

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

Bitmap bitmap = DownloadImage("http://www.allindiaflorist.com/imgs/arrangemen4.jpg");


    ImageView img = (ImageView) findViewById(R.id.img);
    img.setImageBitmap(bitmap);
}

private InputStream OpenHttpConnection(String urlString) 
throws IOException
{
    InputStream in = null;
    int response = -1;

    URL url = new URL(urlString); 
    URLConnection conn = url.openConnection();

    if (!(conn instanceof HttpURLConnection))                     
        throw new IOException("Not an HTTP connection");

    try{
        HttpURLConnection httpConn = (HttpURLConnection) conn;
        httpConn.setAllowUserInteraction(false);
        httpConn.setInstanceFollowRedirects(true);
        httpConn.setRequestMethod("GET");
        httpConn.connect();
        response = httpConn.getResponseCode();                 
        if (response == HttpURLConnection.HTTP_OK) {
            in = httpConn.getInputStream();                                 
        }                     
    }
    catch (Exception ex)
    {
        throw new IOException("Error connecting");            
    }
    return in;     
}
private Bitmap DownloadImage(String URL)
{        
    Bitmap bitmap = null;
    InputStream in = null;   



    try {
        in = OpenHttpConnection(URL);
        BufferedInputStream bis = new BufferedInputStream(in, 8190);

        ByteArrayBuffer baf = new ByteArrayBuffer(50);
        System.out.println("BAF= "+baf);
        int current = 0;
        while ((current = bis.read()) != -1) 
        {
            baf.append((byte)current);
        }
        byte[] imageData = baf.toByteArray();
        System.out.println("imageData= "+imageData);
        bitmap =BitmapFactory.decodeByteArray(imageData, 0, imageData.length);
        in.close();
    } 
   catch (IOException e1) 
   {

        e1.printStackTrace();
    }
    return bitmap;                
}
}

这将返回图像,但我使用的 URL 包含图像名称。如果我有更多图像并且我想在我的应用程序加载时检索所有图像怎么办。

4

5 回答 5

5

我向你推荐一种不同的方式,就像一个魅力:Android Query。

您可以从这里下载该 jar 文件:http ://code.google.com/p/android-query/downloads/list

AQuery androidAQuery=new AQuery(this);

举个例子:

androidAQuery.id(YOUR IMAGEVIEW).image(YOUR IMAGE TO LOAD, true, true, getDeviceWidth(), ANY DEFAULT IMAGE YOU WANT TO SHOW);

使用上面的代码,您可以通过 url 直接显示您的图像。现在下面的代码是直接从 url 获取位图:

androidAQuery.ajax(YOUR IMAGE URL,Bitmap.class,0,new AjaxCallback<Bitmap>(){
                        @Override
                        public void callback(String url, Bitmap object, AjaxStatus status) {
                            super.callback(url, object, status);

                            //You will get Bitmap from object.
                        }


  });

这个库是由 Android 自己提供的,所以使用它并查看你想要的结果。

它非常快速和准确,使用它您可以在加载时找到更多功能,例如动画;如果需要,获取位图;等等

于 2013-10-11T08:41:45.260 回答
3

我建议您使用Volley库(演示文稿在这里),与 Google 在其应用程序 Google Play 中使用的库相同。在 Google I/O 13 上,Ficus Kilkpatrick 展示了 Volley。Volley 是一个 HTTP 库,旨在删除大量样板代码,简化列表中图像的处理,更快,抽象一个或另一个 HTTP 客户端的复杂性。

初始化

Volley 依赖于处理请求队列的 RequestQueue 和负责加载图像的 ImageLoader。我们需要每一个

public static ImageLoader mImageLoader;
public static RequestQueue mRequestQueue;

我们还需要初始化它们。队列需要 Context,ImageLoader 需要 ImageCache。在这里,我使用了 LruCache 的基本包装器。

mRequestQueue = Volley.newRequestQueue(this);
mImageLoader = new ImageLoader(mRequestQueue, new BitmapLru(64000));

初始化在第一个活动的 onCreate() 中完成。

获取图像

假设您必须使用从服务器下载的图像填充网格视图。ImageUrlAdapter 使用 NetworkImageView 填充 GridView(或任何 AdapterView)。这是 Volley 提供的一个类,用于将来自网络的图像放入 ImageView。它实际上扩展了 ImageView,这意味着您可以在任何使用 ImageView 的地方使用它。它使用起来非常简单。适配器中的唯一代码是 getView。

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    NetworkImageView imageView;
    if (convertView == null) {
        imageView = new NetworkImageView(getContext());
    } else {
        imageView = (NetworkImageView) convertView;
    }
    String url = getItem(position);
    imageView.setImageUrl(url, MainActivity.mImageLoader);
    return imageView;
}

这里唯一的新东西是 imageView.setImageUrl(url, MainActivity.mImageLoader);

而已。不需要更多。

于 2013-10-11T09:00:14.577 回答
2

使用通用图像加载器

既然你很困惑,我会解释

单击此处下载 jar 文件并将其粘贴到您的libs文件夹中

在您的清单中添加这两行权限

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

使用此代码

ImageLoader imageLoader = ImageLoader.getInstance();
ImageLoaderConfiguration config = new ImageLoaderConfiguration.createDefault(getApplicationContext())
imageLoader.init(config);
DisplayImageOptions options = new DisplayImageOptions.Builder()
.showStubImage(R.drawable.ic_launcher)
.cacheInMemory()
.cacheOnDisc()
.build();
imageLoader.displayImage("http://www.allindiaflorist.com/imgs/arrangemen4.jpg",your_IMAGEVIEW,options,null);

或者,如果您只想要位图,请使用它

Bitmap bmp = imageLoader.loadImageSync("http://www.allindiaflorist.com/imgs/arrangemen4.jpg");
于 2014-01-03T09:02:43.450 回答
1

我强烈推荐使用 Square 的Picasso库。它非常易于使用,并消除了检索缓存的所有痛苦。

于 2013-10-11T09:02:50.953 回答
0

我建议使用Prime Library ,它具有异步下载图像的功能,然后使用具有 url 和位图图像作为参数的侦听器进行回调。

于 2013-10-11T08:35:36.343 回答