2

PHPリモートサーバーからデータ(画像+テキスト)を取得してGridViewに表示するAndroidアプリケーションがあります。ローダーを使用してバックグラウンドで操作を行っています。画像の取得には時間がかかり、テキストをすぐに表示したいので、画像とテキストには別々の接続があります。テキストは、MySQL から取得された後、サーバー上で Json でエンコードされます。アプリでは、Json オブジェクトを解析し、必要に応じてテキストを表示しています。

問題は画像にあります。Jsonで画像をエンコードするのが良い考えかどうかはわかりません。また、画像はデータベースに blob として保存されます。Json でエンコードするには、前に base64_encode() を使用する必要がありますが、これは効率的ではありません。これに関する多くの投稿を見てきましたが、1 つの画像を取得する必要がある場合は常に単純な例です。私の場合、最大 30 個の小さいサイズの画像を取得します。

私の質問は、私が今提示したことを続けることができるということですが、これを行うためのより良い方法があるはずです. これについてあなたはどう思いますか?私は間違った方向に進んでいますか?

また、「Google Play アプリ」の GridView のように、準備ができたら (すべての画像が準備されるのを待たずに) グリッドビューに各画像を個別に表示できるかどうかを考えていました。これを達成するためにどのようなアプローチを取ることができますか?

よろしくお願いします!

4

2 に答える 2

3

私の目には、HTTP get リクエストを介して通常の画像ファイルとして画像ファイルをダウンロードするのが最善の方法です。もちろんスレッド化されていることを確認し、リクエストをキューに入れることができるスレッドプールを用意し、2〜3個のスレッドを通過させてダウンロードさせます。

それらを保存するという点では、個人的にはデータベース内の BLOB に保存するのではなく、アプリケーションのプライベート ディレクトリ内の永続的なストレージに保存することを選択します。作成したデータベースに ID としてファイル名を付けて画像ファイルを保存すると、それらを再び読み込むのがはるかに速くなります。

また、ImageView への参照を保持し、最初にプレースホルダーを表示することもできます。成功した HTTP 要求は、ImageView のビットマップを、ストレージからダウンロード/読み取ったビットマップに置き換えます。

作成した HTTP リクエスト内で画像キャッシュを行うこともできます。

ImageView myImageView = findViewById(R.id.testImage);
URL url = new URL("http://www.website.com/image.jpg");
URLConnection connection = url.openConnection();
connection.setUseCaches(true);
Object response = connection.getContent();
if (response instanceof Bitmap) {
  Bitmap bitmap = (Bitmap)response;
  myImageView.setBitmap(bitmap);
} 

また、多くのキャッシュ機能を実行する LRUCache の使用方法を調べることも役立つ場合があります。

画像キャッシュの詳細なガイドについては、Android デベロッパー サイトのこのリンクを参照してください。

編集: Robert Rowntreeの回答のアドバイスを使用して、ビットマップをより効率的にロードし、メモリの使用を削減することもできます。このリンクは、より少ないメモリを使用するビットマップの読み込みの詳細を提供しました。これは、Web 経由でダウンロードしてローカル ストレージに保存した大きな画像からサムネイルを作成する場合にうまく機能します。

于 2013-01-07T15:54:19.180 に答える
2

IMO - 2 つの問題があります。ネットワークを介して画像をクライアントに移動し、それらをロードします。

プロトコルとして http を使用していると仮定すると、Apache httpclient パッケージで利用できるように、http 用のマルチスレッド ソリューションが必要です。これにより、写真が電話にすばやく取り込まれます。

次に、写真をメモリとキャッシュに入れて提示する必要があります。ここで、「gallery3D」アプリがグリッドとビットマップで何をするかを考えることができますが、そのコードを読むのはかなり複雑です。

チェックアウト - http://developer.android.com/training/displaying-bitmaps/load-bitmap.html

ビットマップからサムをロードするためのコード サンプルを確認してください。

于 2013-01-07T15:39:03.483 に答える