我正在尝试编写一个简单的应用程序来加载存储在我创建的Web目录中的图像。我希望应用程序获取存储在所述目录中的所有图像并将其显示在布局中。
以下代码仅适用于某些类型的网址(主要是tinypic,但不适用于photobucket,imageshack等),也不适用于目录。
我的图像名称按照image1.png, image2.png
等顺序格式化,以便代码段和downloadFile()
- 方法可以正常工作。
但是,我不确定如何同时从服务器获取所有图像,因为这样只能一次抓取一个图像,将其设置为位图,然后将其显示在IV中。我对Android很陌生,所以对正确方向的一些帮助将不胜感激。
public class NewWallpapersActivity extends Activity {
ImageView imView1;
String imageUrl="http://i133.photobucket.com/albums/q44/slimjady/Wallpapers";
Random r= new Random();
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle SavedInstanceState) {
super.onCreate(SavedInstanceState);
setContentView(R.layout.newwallpapers);
Button bt3= (Button)findViewById(R.id.get_imagebt);
bt3.setOnClickListener(getImgListener);
imView1 = (ImageView)findViewById(R.id.IV1);
}
View.OnClickListener getImgListener = new View.OnClickListener(){
public void onClick(View view) {
//i tried to randomize the file download, in my server i put 4 files with name like
//png0.png, png1.png, png2.png so different file is downloaded in button press
int i =r.nextInt(4);
downloadFile(imageUrl+"png"+i+".png");
Log.i("im url",imageUrl+"png"+i+".png");
}
};
Bitmap bmImg;
void downloadFile(String fileUrl){
URL myFileUrl = null;
try {
myFileUrl= new URL(fileUrl);
} catch (MalformedURLException e) {
e.printStackTrace();
}
try {
HttpURLConnection conn= (HttpURLConnection)myFileUrl.openConnection();
conn.setDoInput(true);
conn.connect();
InputStream is = conn.getInputStream();
bmImg = BitmapFactory.decodeStream(is);
imView1.setImageBitmap(bmImg);
} catch (IOException e) {
String exception = "Erro: An Exception Was Thrown";
Toast errortoast = Toast.makeText(this, exception, Toast.LENGTH_SHORT);
errortoast.show();
e.printStackTrace();
}
}
}
答案 0 :(得分:2)
以下是对此问题的一些看法:
由于你想要在一个文件夹中显示所有图像,我建议你有一个Directory
- 活动,它显示给定目录中的所有图像和一个Image
- 活动只显示一个图像。
为了正确呈现这一点,我建议using a GridView
显示所有图像,并使用全屏ImageView
显示正常活动以显示单个图像。
你也可以use the Gallery
-widget“结合”这两个想法。
您的方法的一个更大问题是,图片会在UI-Thread上下载。
根据所有图像或单个图像的大小以及可用的连接速度,下载图像可能需要一段时间。在下载图像时,UI-Thread将等待您的downloadStuff()
- 方法返回,UI将冻结。这可能会造成您的应用程序崩溃的错觉。
因此,您需要在单独的线程中进行下载。 Android有一个方便的包装器,称为AsyncTask
。
向您的用户显示该过程可能需要一段时间,您可以使用ProgressDialog
来说明这一点(在UI-Thread上)。
现在我们已经到了必须面对一些限制的地步。如果您想使用上面列出的图片寄存器,您需要检查它们是否为您提供API(或相同的东西)以从某个目录/相册中获取图像(或其URL)列表(在首页上寻找“API”链接。
如果您在自己的服务器上托管图像,您应该能够创建一个小的PHP脚本(或您喜欢的任何脚本/编程语言),然后列出目录中的所有图像文件并将其呈现在易于解析的方式(JSON或XML)。
这使您可以获取要显示的图像文件的URL列表。