1

我正在开发一个应用程序,它是一个产品目录。用户可以搜索和查看产品(书籍)。它都是只读的,所以允许用户查看产品。当用户点击一个产品时,下一个屏幕显示-书名-书名-封面图片。

这是我有一个问题的图片部分。我知道呈现可绘制对象的一种方法是将它们放在我的 android 项目中的“可绘制”方向并以 android:src="@drawable/name" 的形式访问它们(在我的 xml 文件中)。

唯一的问题是会添加新产品,所以当我发布它时,我无法将可绘制对象存储在 APK 文件中。我需要在运行时阅读它们。我想知道解决这个问题的最佳方法是什么。

我正在考虑(第一次)启动执行 AsyncTask 的应用程序,该任务将调用 HttpURLConnection 的 openConnection 并抓取所有可绘制对象(从网站上的特定远程目录),然后将它们存储在 sqllite db 中(如一个斑点)。数据库中的每个产品都可以很容易地与其特定的可绘制对象相关联。

不确定是否有更好的方法?或者我应该将它们保存到设备的内部存储中(我知道大小是这个选项的问题)。尝试按需获取可绘制对象可能需要 2-4 秒(即从远程服务器获取)。有没有办法以有效的方式下载drawables?

更新:上述方法的唯一问题是获取远程可绘制对象并将其呈现在设备上所需的时间(2-7 秒之间)。因此,出于性能原因,我不能采用这种方法。当用户第一次启动应用程序时,它(使用异步任务)抓取所有产品(远程在 csv 中)并将其内容存储在 SQLLite 数据库中。所以他们在应用程序第一次启动时有一个可以接受的等待时间,但之后就没有了。我想做一些类似的事情(即也得到drawables),但不确定我应该将它们存储在内部存储中还是将它们作为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;

    }

检查 Internet 连接:

// 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 回答