【发布时间】:2012-12-21 02:30:49
【问题描述】:
我不太确定我的代码或结构出了什么问题。我想使用 AsyncTask 下载图像并同时显示进度条。但我尝试了几种不同的方法。它仍然失败,不知道有什么问题。我的结构流程是
ContentID 是一个字符串数组,用于存储图片的内容 ID。
主要问题:它设法从url下载图像并存储到手机中,但下载的图像都是同一个图像。它应该是不同的图像,这不是我的预期。
次要问题:应用下载图片时弹出进度条,但进度条没有更新进度。它只是保持 0% 并在下载完成后关闭。
我想知道是什么导致了我提到的主要和次要问题。如果您知道我的代码有什么问题,请发表评论或回答。任何帮助将不胜感激。
if(isSyncSuccess){
SetConstant.IMAGE_EXIST = 1;
pDialog = new ProgressDialog(GalleryScreen.this);
pDialog.setMessage("Downloading file. Please wait...");
pDialog.setIndeterminate(false);
pDialog.setProgress(0);
pDialog.setMax(contentId.length);
pDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
pDialog.setCancelable(true);
if (contentId.length>0){
Log.i(TAG, "contentid.length:" +contentId.length);
for (int i=0;i<contentId.length;i++){
if(helper.databaseChecking(useremail, contentId[i])){
contentdownload = i;
SetConstant.CONTENT_ID = contentId[i];
String URL = SetConstant.URL_DOWNLOAD_CONTENT+contentId[i];
DownloadFile downloadFile = new DownloadFile();
downloadFile.execute(URL);
}
private class DownloadFile extends AsyncTask<String, Integer, String>{
@Override
protected String doInBackground(String... sUrl){
Bitmap bm;
InputStream in;
try{
in = new java.net.URL(sUrl[0]).openStream();
bm = BitmapFactory.decodeStream(new PatchInputStream(in));
File storage = new File(Environment.getExternalStorageDirectory() + File.separator + "/Image/");
Log.i(TAG,"storage:" +storage);
Log.i(TAG,"storage:" +storage.getAbsolutePath());
if(!storage.exists()){
storage.mkdirs();
}
String FileName = "/"+SetConstant.CONTENT_ID+".jpg";
FileOutputStream fos = new FileOutputStream(storage + FileName);
bm.compress(Bitmap.CompressFormat.JPEG, 85, fos);
String filepath = storage + FileName;
File filecheck = new File (filepath);
long fileSize = filecheck.length();
fos.flush();
fos.close();
Log.i(TAG, "bm:" +bm);
Log.i(TAG, "fos:" +fos);
Log.i(TAG, "filesize:" +fileSize);
Log.i(TAG, "filepath:" +filepath);
}
catch(IOException e1){
e1.printStackTrace();
}
return null;
}
@Override
protected void onPreExecute(){
super.onPreExecute();
pDialog.show();
}
@Override
protected void onProgressUpdate(Integer... progress){
super.onProgressUpdate(progress);
pDialog.setProgress(progress[0]);
}
protected void onPostExecute(String result){
super.onPostExecute(result);
pDialog.dismiss();
}
}
编辑
现在应用程序可以根据进度条下载图像了!但是我遇到的另一个问题是当应用程序无法完成下载时如何返回错误消息。目前,当应用程序下载失败时,它会崩溃。我相信我不应该在 doInBackground 里面运行它。但是我还能在哪里进行检查?知道如何作为错误消息返回并请求用户重试而不是使应用程序崩溃吗?
【问题讨论】:
-
我没有遇到任何错误。
-
哦,关于那个我拿出了一些 Log.i 和问题中的其他服务器内容。因此,获得您想看到的 Log.i 可能有点困难。我只是展示我遇到问题的部分。
-
我添加了应该做什么的示例代码。
-
接受您的编辑并提出另一个问题。这是一个不同的主题。
标签: android download android-asynctask progress-bar