1

サーバー上に複数の画像があります。私がやりたいことは、これらの画像をサーバーから取得して、imageView に設定することです。

サーバーからブロブタイプの画像を取得し、それをバイト配列にデコードしてから、ビットマップ画像に変換しました。

サーバーからビットマップ画像を取得する方法について混乱しています。

私は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 は、多くのボイラープレート コードを削除し、リスト内の画像の処理を簡素化し、高速化し、1 つまたは別の HTTP クライアントの複雑さを抽象化することを目的とした HTTP ライブラリです。

初期化

Volley は、リクエストのキューを処理する RequestQueue と、画像の読み込みを担当する ImageLoader に依存しています。それぞれ1つずつ必要です

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 は、GridView (または任意の AdapterView) に NetworkImageView を設定します。これは、ネットワークからの画像を ImageView に入れるために Volley が提供するクラスです。実際には 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 に答える
0

Prime Libraryを使用することをお勧めします。画像を非同期にダウンロードする機能があり、URL とビットマップ画像をパラメーターとして持つリスナーを使用したコールバックがあります。

于 2013-10-11T08:35:36.343 に答える