我不太确定我的代码或结构出了什么问题。我想使用 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 里面运行它。但是我还能在哪里进行检查?知道如何作为错误消息返回并请求用户重试而不是使应用程序崩溃吗?