android +访问远程drawables - 最佳实践

时间:2012-09-24 10:29:34

标签: android drawable

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

这是我提出问题的图片部分。我知道提出drawables的一种方法是将它们放在" drawable"我的android项目中的方向并访问它们(在我的xml文件中)为android:src =" @ drawable / name"。

唯一的问题是新产品会被添加,因此当我发布时,我无法将简易文件存储在APK文件中。我需要在运行时阅读它们。我想知道最好的办法是什么。

我正在思考(第一次)启动执行AsyncTask的应用程序 openConnection of HttpURLConnection并将抓取所有drawable(来自网站上的特定远程目录),然后将它们存储在sqllite数据库中(作为blob)。数据库中的每个产品都可以轻松地与其特定的可绘制关联。

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

更新:上述方法的唯一问题是抓取遥控抽屉并在设备上渲染它所需的时间(2-7秒之间)。因此,出于性能原因,我不能采用这种方法。当用户第一次启动应用程序时,它(使用ASynch任务)会抓取所有产品(远程使用csv)并将其内容存储在SQLLite数据库中。所以他们在首次推出应用程序时可以获得一个小小的可接受等待,但之后没有。我想做类似的事情(也就是得到drawables)但不确定我应该将它们存储在内部存储中还是将它们作为BLOB保存到数据库中。最大尺寸为每个2-3kb,但总共可以有300个产品

任何帮助都会很棒。我在Android 4.0.3上开发。

谢谢 - Ro

1 个答案:

答案 0 :(得分: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();

            }