我正在开发一个应用程序,它是一个产品目录。用户可以搜索和查看产品(书籍)。这一切都是只读的,因此允许用户查看产品。当用户点击产品时,将显示下一个屏幕 - 书名 - 书作者 - 封面图片。
这是我提出问题的图片部分。我知道提出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
答案 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();
}