1

製品カタログであるアプリを開発しています。商品(書籍)を検索・閲覧できます。すべて読み取り専用で、ユーザーが製品を表示できるようにします。ユーザーが製品をクリックすると、次の画面が表示されます - 書籍のタイトル - 書籍の著者 - 表紙の写真。

質問したい画像の部分です。ドローアブルを提示する1つの方法は、Androidプロジェクトで「ドローアブル」方向に配置し、(xmlファイルで)android:src="@drawable/name"としてアクセスすることです。

唯一の問題は、新しい製品が追加されるため、リリース時に APK ファイルにドローアブルを保存できないことです。実行時にそれらを読み取る必要があります。これにアプローチする最善の方法は何だろうと思っています。

私は(最初の)アプリの起動時にAsyncTaskを実行して、HttpURLConnectionのopenConnectionを呼び出し、(Webサイトの特定のリモートディレクトリから)すべてのドローアブルを取得し、それらをsqllite dbに保存することを考えています(ブロブ)。データベース内の各製品は、特定のドローアブルに簡単に関連付けることができます。

これに対するより良いアプローチがあるかどうかわからない? または、デバイスの内部ストレージに保存する必要があります (このオプションではサイズが問題になることがわかっています)。ドローアブルをオンデマンドで取得しようとすると、2 ~ 4 秒かかる場合があります (リモート サーバーからの取得など)。ドローアブルを効率的にダウンロードする方法はありますか?

更新: 上記のアプローチの唯一の問題は、リモート ドローアブルを取得してデバイス上でレンダリングするのにかかる時間 (2 ~ 7 秒) です。したがって、パフォーマンス上の理由から、そのアプローチを採用することはできません。ユーザーが初めてアプリを起動すると、(ASynch タスクを使用して) すべての製品が (リモートで csv に) 取得され、そのコンテンツが SQLLite データベースに保存されます。そのため、アプリの最初の起動時には許容できる程度の待ち時間がありましたが、その後はありませんでした。私は似たようなことをしたいのですが (つまり、ドローアブルも取得します)、それらを内部ストレージに保存するか、BLOB としてデータベースに保持する必要があるかわかりません。各サイズの最大サイズは 2 ~ 3kb ですが、合計で 300 個の製品が存在する可能性があります

どんな助けでも素晴らしいでしょう。私は Android 4.0.3 で開発しています。

ありがとう - ロー

4

1 に答える 1

2

あなたが説明した方法は、そのようなタスクを実行するための最良の方法です。写真を変更するたびに携帯電話で変更されるように、オンラインから直接それらを取得します。また、より簡単な方法として、インターネット接続を確認する前に、画像をデータベースに保存する必要なく、ユーザーに画像を直接表示できます。

画像を取得する関数:

public static Bitmap getBitmapFile(String str)
    {
        Bitmap bmImg=null;
        URL myFileUrl;
        try {
            myFileUrl = new URL(str);
            HttpURLConnection conn= (HttpURLConnection)myFileUrl.openConnection();
            conn.setDoInput(true);
            conn.connect();
            InputStream is = conn.getInputStream();
            bmImg = BitmapFactory.decodeStream(is);
        } catch (Exception e) {
            e.printStackTrace();
        }

        return bmImg;

    }

インターネット接続を確認するには:

// declaring variable for holding Internet connection state
        boolean connected = false;
        // checking connectivity to the Internet through mobile network or WIFI
        ConnectivityManager connectivityManager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
            if(connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState() == NetworkInfo.State.CONNECTED || 
                    connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState() == NetworkInfo.State.CONNECTED) {
                // Internet connection
                connected = true;
            }
            else
                // no Internet connection
                connected = false;

例:

            // grab image to display
            try {
                // Bitmap bmp1;
                    // String url1;
                    // ImageView img1;

                // in case there is Internet connection display image from online url
                if(connected == true)
                {
                    bmp1=MainActivity.getBitmapFile(url1); 
                    img1.setImageBitmap(bmp1);
                    }
                    else
                    {
                    img1.setImageResource(R.drawable.not_connected);
                    }
                } catch(Exception e) {

                e.printStackTrace();

            }
于 2012-09-24T10:54:50.650 に答える