在我的应用程序中,我必须显示一些图像。它们存储在设备上。但是,如果某些图片未保存在设备上,则应从网上下载。 问题是我必须显示下载动画(例如,简单的圆形进度条,只是旋转动画或简单图片),下载完成后,只需重新加载包含图片的视图。所以我在UI线程中有以下代码:
if(notDownloaded)
{
Methods.downloadFile(fileparams);
ImageView iv = new ImageView(context);
iv.setImageResource(R.drawable.downloading);
listOfPictures.add(iv);
}
Methods.downloadFile()
public static void downloadFile(DCFile _dcFile, Context _context) {
final DCFile dcFile = _dcFile;
final Context context = _context;
Thread thread = new Thread(){
@Override
public void run(){
String response = "";
try {
Download download = new Download();
response = download.execute(dcFile,context).get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
if(response.equals("OK"))
{
downloadFinished.onDownloadFinished(); //interface-event
}
}
};
thread.run();
}
onDownloadFinished
刷新图片视图。
班级Download
:
public class Download extends AsyncTask<Object, Void, String>
{
@Override
protected String doInBackground(Object... params) {
DCFile dcFile = (DCFile) params[0];
Context context = (Context) params[1];
try {
URL url = new URL(dcFile.getPath() + dcFile.getFileName());
File file;
if(dcFile.getType() == 0)
{
File dir = new File(context.getFilesDir(), "pics/");
if(!dir.exists())
dir.mkdirs();
file = new File(context.getFilesDir(), "pics/" + dcFile.getUid());
}
else
{
File dir = new File(context.getFilesDir(), "voices/");
if(!dir.exists())
dir.mkdirs();
file = new File(context.getFilesDir(), "voices/" + dcFile.getUid());
}
if(file.exists())
return "";
FileUtils.copyURLToFile(url, file, 5000, 10000);
} catch (MalformedURLException e) {
e.printStackTrace();
return "";
} catch (IOException e) {
e.printStackTrace();
return "";
}
return "OK";
}
}
因此,如果错过了一些照片,我应该看到R.drawable.downloading
,然后,当下载照片时,我已经看过那张照片了。
但是,当图片下载时我看到黑屏,然后是那张图片。
所以我意识到UI线程在图片下载完成时等待。
如何解决这个问题?错误在哪里?